VesselWheel

시저암호 본문

Coding Test Practice in Swift

시저암호

JasonYang 2024. 2. 28. 09:53

문제

풀이

func solution(_ s: String, _ n: Int) -> String {
    let lowerCaseLetters = Array("abcdefghijklmnopqrstuvwxyz")
    let upperCaseLetters = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    var result = ""

    for char in s {
        if char == " " {
            result.append(" ")
            continue
        }
        
        let letters = char.isLowercase ? lowerCaseLetters : upperCaseLetters
        if let index = letters.firstIndex(of: char) {
            let shiftedIndex = (index + n) % 26
            result.append(letters[shiftedIndex])
        }
    }
    
    return result
}

해석

1. 알파벳이 대문자, 소문자로 이루어져 있고, String 값을 반환해야하기 때문에 각기 프로퍼티화하여 초기화 한다. 

    let lowerCaseLetters = Array("abcdefghijklmnopqrstuvwxyz")
    let upperCaseLetters = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    var result = ""

2. 제한 조건에 공백은 아무리 밀어도 공백이기 때문에, 공백일 경우 공백값 그대로 String에 넣어준다. 

    for char in s {
        if char == " " {
            result.append(" ")
            continue
        }

3. 문자열 s를 넣어준 char 프로퍼티가 소문자이면 소문자를, 아니면 대문자를 letters에 프로퍼티화 하고, 

let letters = char.isLowercase ? lowerCaseLetters : upperCaseLetters

4. 프로퍼티화 한 char 타입의 letters의 인덱스를 찾아, n 만큼 민, 즉 n 만큼 더해준 인덱스에 알파벳의 총 글자가 26이므로, 26으로 나누어주면, n 만큼 밀어진 알바벳읠 26개 글자에서 원래 순서에 해당되는 알파벳을 구할 수 있다. 

            let shiftedIndex = (index + n) % 26
            result.append(letters[shiftedIndex])

5.  마지막으로 밀어져서 정해진 순서의 알바벳을 String 반환 값에 넣어 것은 return 한다.