[알고리즘] Swift -프로그래머스 연습문제 #155652(둘만의 암호)

2023. 4. 5. 03:41ALGORITHM/Swift

728x90
반응형

문제링크

 

 

 

 

분석

문자열 s와 skip, 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만든다.

  • 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꾼다.
  • index만큼 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아간다.
  • skip에 있는 알파벳은 제외하고 건너뛴다.

예를 들어 

s= "aukks", skip="wbqd", index=5 일때

a에서 5만큼 뒤에 있는 알파벳은 (abcdef) f지만 skip에 b와 d가 포함되어있기 때문에 abcdefgh 로 h가 된다.

이렇게 변경할 때 변환한 결과를 리턴하는 문제이다.

 

풀이 과정

알파벳순서대로 저장하고 제외배열의 알파벳을 제거하면 되지 않을까 ..?

바로 도전

let alpha = "abcdefghijklmnopqrstuvwxyz"
var arr = Array(alpha)

전체 알파벳을 넣은 배열을 만들어 준다.

for i in 0..<skip.count {
    arr.remove(at: arr.firstIndex(of: skipChar[i])!)
}

skip배열에 있는 알파벳을 제거한다.

var result = ""
for i in 0..<s.count {
    let originIndex = arr.firstIndex(of: char[i])!
    var nextIndex = originIndex + index
    if nextIndex >= arr.count {
        nextIndex -= arr.count
    }
    result += String(arr[nextIndex])
}

이제 다음 index값을 더해주고 그 알파벳을 출력한다.

여기서 중요한 부분은 인덱스가 넘어갈 경우이다.

제거한 알파벳이 있기 때문에 배열의 크기보다 더해준 인덱스 (=다음 인덱스)가 클 경우에는 배열의 범위를 넘어가버린다.

그래서 다음인덱스에서 배열의 크기만큼 뼤준다.

그러면 이러한 오류가 생긴다.

논리 오류로 배열의 인덱스나 옵셔널 등의 문제가 생겼을 때 나온다고 한다.

질문하기를 찾아보니 어떤 분이 친절하게 설명을 해주신 걸 보고 도움을 얻었다.

알파벳 개수는 26개이고 skip의 최댓값은 10, index의 최댓값은 20이다.
skip = 'abcdefghij' 일 때, s에 z가 포함되고 index = 20인 경우
arr.count = 16, z의 originIndex = 15, z의 nextIndex = 35이다.
해당 예제를 위의 나의 코드와 연결하면 
if nextIndex >= arr.count { nextIndex -= arr.count }
35-16 = 19로
계산결과 값도 arr.count를 넘기게 된다.

이를 해결하기 위해서 arr.count보다 작을 때까지 계속 빼준다.

while nextIndex >= arr.count {
    nextIndex -= arr.count
}

그러면 arr.count 보다 작은 값이 결과로 나오게 되어 알파벳을 출력할 수 있게 된다.

해당 문제는 인덱스값이 배열의 크기보다 컸기 떄문에 나왔었다.

 

 

풀이

import Foundation

func solution(_ s:String, _ skip:String, _ index:Int) -> String {
    let char = Array(s)
    let skipChar = Array(skip)
    
    let alpha = "abcdefghijklmnopqrstuvwxyz"
    var arr = Array(alpha)
    
    for i in 0..<skip.count {
        arr.remove(at: arr.firstIndex(of: skipChar[i])!)
    }
    
    var result = ""
    for i in 0..<s.count {
        let originIndex = arr.firstIndex(of: char[i])!
        var nextIndex = originIndex + index
        while nextIndex >= arr.count {
            nextIndex -= arr.count
        }
        result += String(arr[nextIndex])
    }
    
    return result
}

 

결과

print(solution("aukks"  , "wbqd"   , 5 ))

 

 


📂  정리

배열의 크기, 인덱스에 대한 오류를 잘 생각해야한다

런타임에러가 났을 경우에도 배열에 문제가 있을 경우가 대부분이다.

이를 배열의 크기를 잘 생각해야 한다..

 

 

 

 

 

728x90
반응형