본문 바로가기
프로그래머스 Algorithm

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

by Echung 2023. 12. 9.

안녕하세요. 이번에는 프로그래머스 시저 암호 문제를 풀어보려고 합니다.

 

 

프로그래머스

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

programmers.co.kr


Problem

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

 

[제한 사항]

공백은 아무리 밀어도 공백입니다.

s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.

s의 길이는 8000 이하입니다.

n은 1 이상, 25 이하인 자연수입니다.

사진 1. 입출력 예


Solution

class Solution {
    fun solution(s: String, n: Int): String {    
         var answer: String = ""
        
         for(c in s) {
             if(c.isLetter()) {
                 val base = if(c.isUpperCase()) 65 else 97
                 val temp =  (c.toInt() - base + n) % 26 + base
                
                 answer += temp.toChar()
             } else {
                 answer += " "
             }
         }
        
         return answer
    }
}

 이번 문제는 공백을 알기 위해서 Kotlin에서 제공해 주는 isLetter()을 사용하였습니다. isUpperCase()를 활용해서 char가 대문자인지 소문자인지 확인을 해줍니다. 여기서 n만큼 밀어주기 위해서 char의 위치를 0을 만들기 위해서 base를 빼주고, n을 더해줍니다.

 

ex)
// 여기서 A는 대문자이므로 65의 값을 가집니다.
val char:Char = 'A'

// base는 대문자인 것을 확인해서 65의 값이 됩니다.
val base = if(char.isUpperCase()) 65 else 97

// temp는 char가 a or A 일때 0으로 만들기 위해 base를 빼주고 n만큼 밀기 위해서 n을 더해줍니다.
// 그리고 알파벳은 총 26자 이기때문에 26을 나눈 나머지를 구해줍니다.
// 여기서 마지막으로 base를 더해주면 원래 소문자인지 대문자인지를 알 수 있습니다.
val temp = (char.toInt() - base + n) % 26 + base

 

1. 다른 사람 코드

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

  저의 코드와 다르게 map과 when을 조합해서 문제를 해결한 코드가 있어서 공부용으로 가져와봅니다. 기본적인 베이스는 저와 같은 방법으로 문제에 접근하였지만, when을 잘 활용하면서 마지막으로 joinToString()을 통해서 String으로 만들어 줘서 가독성면에서 많이 좋아진 모습을 볼 수 있었습니다. Kotlin에서는 Java와 다르게 when을 제공해 주는데 앞으로는 when을 잘 활용해 봐야겠습니다.


Performance

1. 내가 작성한 코드 2. 다른 사람 코드

반응형