Algorithm/프로그래머스

[swift] 프로그래머스 - 둘만의 암호

yanni13 2024. 1. 19. 16:16

 

 

 

문제 설명

 

두 문자열 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 다 풀기인데 할 수 있겠지 ?  . .ㅜㅜ