[알고리즘] Swift -프로그래머스 연습문제 #155652(둘만의 암호)
문제링크
분석
문자열 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 ))
📂 정리
배열의 크기, 인덱스에 대한 오류를 잘 생각해야한다
런타임에러가 났을 경우에도 배열에 문제가 있을 경우가 대부분이다.
이를 배열의 크기를 잘 생각해야 한다..