알고리즘/프로그래머스

[프로그래머스/Swift] 둘만의 암호

녕이 2023. 2. 12. 09:43
728x90

 

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

새로운 Lv1 문제가 나왔다. 이런 건 다 풀어줘야지~~

문자열 유형이었는데, 알파벳을 배열(alph)에 넣고 진행해 줬다.

문자열 배열 s를 순회하면서 시작위치를 idx에 넣어줬는데 여기서 UnicodeScalar를 사용해서 "a"를 기준으로 상대적인 위치값을 구했다.

그리고 문제를 잘 읽어보면 skip에 포함된 알파벳을 무시하고 넘어가야 되기 때문에 if 조건문을 달아줬다.

skip에 포함되지 않으면 cnt + 1

while 반복문을 진행하다가 만약 index 개수만큼 알파벳을 넘겼다면 문자열의 알파벳을 index 만큼 뒤로 간(skip을 제외한) 그 알파벳 값으로 갱신하고 끝내준다.

 

import Foundation

func solution(_ s:String, _ skip:String, _ index:Int) -> String {
    var s = s.map{ String($0) }
    let alph = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    for i in 0..<s.count {
        var cnt = 0
        var idx = Int(UnicodeScalar(s[i])!.value) - Int(UnicodeScalar("a").value) //시작 위치
        while true {
            idx = (idx + 1) % 26 //다음 위치
            if !skip.contains(alph[idx]) { //다음 위치의 알파벳이 skip에 없다면
                cnt += 1 //카운팅
            }
            if cnt == index {
                s[i] = alph[idx]
                break
            }
        }
    }
    return s.joined()
}

 

 

다른 사람의 코드를 보니, UnicodeScalar를 사용하지 않고 알파벳 배열을 사용해서 firstIndex로 idx 값을 구한 것을 보았다.

다음엔 나도 이렇게 해봐야지!

 

 

728x90