[프로그래머스] 시저 암호

neoneoneo·2024년 2월 28일
0

kotlin

목록 보기
15/49

문제

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

나의 풀이

class Solution {
    fun solution(s: String, n: Int): String {
        var answer = ""
        s.forEach {
            if (it.toInt() == 32) {
                answer += " "
            } else {           
                val shifted = it.toInt() + n
                if(it.isLowerCase()) {
                    answer += if (shifted > 122) (shifted - 26).toChar() else shifted.toChar()
                } else {
                    answer += if (shifted > 90 && it.isUpperCase()) (shifted - 26).toChar() else shifted.toChar()
                }
            }
        }     
        return answer
    }
}

고수의 풀이

class Solution {
    fun solution(s: String, n: Int): String =
        s.map {
            when {
                it.isLowerCase() -> 'a' + (it + n - 'a') % 26
                it.isUpperCase() -> 'A' + (it + n - 'A') % 26
                else -> ' '
            }
        }.joinToString("")
}

배운점

  • 이번에도 고수의 코드에는 map이 쓰였다. 분명 for, forEach 말고 다른 방법이 있을 터이지만, 어떻게 쓸지 감도 안왔었다. 한번 살펴보자.
  • map{} 의 활용
    • s.map {...} : 문자열 s의 각 문자에 대한 매핑을 수행하며, 그 안에 when 문을 사용하여 람다 함수를 적용할 수 있다.
  • when{} 의 활용
    • when {...} : 소/대문자의 경우를 나누어서 조건문 처리 하였다.
      • 'a' + (it + n - 'a') % 26
        • it + n - 'a' : 현재 문자에서 거리 n을 더하고 a 값을 빼준다.
        • % 26 : 알파벳 길이는 26으로 나누어진다. 이 부분이 알파벳 범위를 벗어나면 다시 처음부터 시작하도록 한다.
        • 마지막에 'a'를 더해서 다시 알파벳의 범위로 매핑된다.
        • 예시)
          • s = c, n = 2
          • c는 아스키코드 99이다.
          • (99 + 2 - 97) = 4
          • 4 % 26 = 4
          • 4 + 97 = 101 로 'e'가 된다.
  • joinToString() 의 활용
    • 매핑된 문자들을 하나의 문자열로 결합시켜준다.

[TIL-240228]

0개의 댓글