[swift] 프로그래머스 - 둘만의 암호
문제 설명
두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.
- 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
- index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
- skip에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.
두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.
문제 풀기 전 아이디어
1. s에 입력받은 문자열을 배열로 변환하여 첫번째 인덱스를 구해야 한다.
2. 반복문을 통해 s의 문자열 길이 만큼 (=배열 길이 만큼) 반복해야 한다.
3. skip에 포함된 문자 중에 s문자열에도 있는지 조건문으로 검사한다. (skip에 포함되면 넘기고, 포함되지 않으면 하나 빼주기)
전체 코드
import Foundation
func solution(_ s:String, _ skip:String, _ index:Int) -> String {
let alphabet = "abcdefghijklmnopqrstuvwxyz".map { String ($0)}
var s = s.map { String ($0)} //알파벳을 요소로 갖는 배열
for i in 0..<s.count { //s의 문자열만큼 반복 실행
if var temp = alphabet.firstIndex(of: s[i]) {
var index = index
while index > 0 {
temp += 1
temp %= 26
if skip.contains(alphabet[temp]) { continue }
index -= 1
s[i] = alphabet[temp]
}
}
}
return s.joined()
}
느낀 점
45분정도 시간을 재면서 문제를 풀다가 결국 해결하지 못하고 블로그를 참고하였다. 해당 문제에서 String 관련 함수들을 사용해야 했었고 이런 함수들을 찾아보면서 문제를 풀다보니 시간이 더 길어졌던 거 같다.
이 문제를 풀기 위해 찾아봤던 string 관련 문자열을 정리 해보았다.
특정 문자의 인덱스를 알고 싶을 때 : firstIndex(of:)
특정문자를 포함하고 있는지 여부를 알고 싶을 때 : contains()
문자열을 문자 하나하나 쪼개서 배열로 만들고 싶을 때 : map()
아직 코테는 너무 어렵다 . . .ㅜㅜ
이번달 목표는 프로그래머스 레벨 1 다 풀기인데 할 수 있겠지 ? . .ㅜㅜ