Programmers/Lv. 1

[Kotlin] Programmers Lv. 1 시저 암호

chattymin 2023. 9. 25. 12:48
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

Code


class Solution {
/*
    fun isSmall(ch: Char) = ch in 'a'..'z'

    fun isBig(ch: Char) = ch in 'A'..'Z'

    fun solution(s: String, n: Int): String {
        var answer = ""

        s.forEach {
            var temp = ' '

            if (isSmall(it)){
                temp = it + n
                if (temp > 'z')
                    temp -= 26
            }else if (isBig(it)){
                temp = it + n
                if (temp > 'Z')
                    temp -= 26
            }

            answer += temp
        }

        return answer
    }
     */

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

흔한 문자 뒤로 밀기 문제이다. 

현재의 char값에 n만큼 늘려준 후 아스키코드를 활용해서 z를 넘어갔을 때의 대처를 해준다.

 

이 문제는 기존의 문자 뒤로 밀기 문제에서 띄어쓰기가 있다는 차이점이 있다.

그래서 처음 문제를 풀때는 소문자, 대문자인지 확인하는 함수를 사용해서 띄어쓰기를 검출하고, 해당하는 값에 대해서만 처리해줬다.

 

문제를 통과한 후 다른사람들이 풀이를 보는데 isLowerCase를 사용해서 검사를 하더라. 

내부 코드를 확인해보니 내가 작성한 isSmall과 같은 내부 로직을 가지고 있더라.

 

그리고 값을 더한 후 범위를 초과하면 초과한만큼 빼는 방법을 초반에 사용했지만, 초과하는 범위만큼을 애초에 배재한 후 더하는 방법이 있었다. 그래서 그 방법이 훨씬 더 가독성이 좋은 코드라는 생각이 들어서 아래와 같이 수정했다.

 

 

수학적인 사고의 중요성을 오랜만에 깨달은 문제였다.

728x90
반응형