본문 바로가기
코딩 테스트/프로그래머스

[프로그래머스] (Swift) 시저 암호 - Lv.1

by Dev.Andy 2023. 5. 2.

코딩테스트 연습 - 시저 암호 | 프로그래머스 스쿨

 

풀이

유니코드 스칼라 값과 정수 값을 오가는 것에 애를 많이 먹었다. 공식 문서를 찾아 보려 해도 키워드로 UnicodeScalar, unicodeScalar를 찾으면 문서가 너무 많이 나오고 설명이나 예시 코드가 많지 않아서 애를 많이 먹었다.🥲

  • 결괏값을 빈 문자열로 초기화
  • 공백인 경우 공백을 결괏값에 더하고 continue한다.
  • 다음에는 간격을 더한 알파벳 값이 끝 값(z, Z)을 넘어 초과할 경우 이를 바꿔줘야 하는데, 이게 좀 까다롭다.
  • 초과하지 않는 경우에는 단순히 간격을 더한 값을 결괏값에 더한다.

 

코드

func solution(_ s:String, _ n:Int) -> String {
    var result = ""

    // 문자열의 유니코드 스칼라 값으로 변환하여 반복
    for v in s.unicodeScalars {
        // 유니코드 스칼라 값이 공백일 경우 결괏값에 공백 추가
        // 조건문 아래의 문장은 건너뜀
        if v.value == 32 {
            result += " "
            continue
        }

        // 스칼라 값에 대한 정수형에, 밀어야 값을 더하여 addValue 변수 생성
        var addValue = Int(v.value) + n

        // (1) addValue의 값이 122("z")보다 크거나 90("Z")과 97("a")의 사이이거나,
        //     대문자인데 소문자 범위에 들어갔을 경우, 26을 뺀 값을 문자열로 변환하여 결괏값에 추가
        // (2) 그렇지 않을 경우, 해당 값의 유니코드 값을 문자열로 변환하여 결괏값에 추가
        if addValue > 122 || (addValue > 90 && addValue < 97) || (addValue >= 97 && addValue <= 115 && v.value <= 90) {
            result += String(Unicode.Scalar(addValue - 26)!)
        } else {
            result += String(Unicode.Scalar(addValue)!)
        } 
    }

    // (+) ascii 값 구하기
//     var string = "AZaz" // 65~90 & 97~122
//     for char in string.unicodeScalars {
//         print(char.value)
//     }
    return result
}

댓글