시저 암호 문제

 

 

아스키 코드를 알아야 z 에서 a로 다시 돌아올 수 있을 것 같다.

 

아스키 코드

아스키 코드는 요래 생겼다.

 

A - Z 는 65 부터 90 a -z 는 97 부터 122

 

class Solution {
    fun solution(s: String, n: Int): String {
        var answer = ""
        //[a, B, z] , 4
        s.map {
            if(it == ' '){
                answer += it
            }
            else if(it.isUpperCase()){
                if((it + n).toInt() > 90){
                    answer += (it + n) - 26
                }
                else {
                    answer += it + n
                }
            }
            else {
                if((it + n).toInt() > 122){
                    answer += (it + n) - 26
                }
                else{
                    answer += it + n
                }
            }
        }
        
        return answer
    }
}

 

.map 함수를 사용하여 문자열을 리스트에 담아 원소 하나하나를 다뤄준다. 활용도가 매우 좋은 듯^^

예시를 위해 "abcd" 문자열을  .map으로 ["a", "b", "c", "d"] 이런 형식으로 바꿔줄 수 있다.

 

공백은 그대로 문자열에 넣고 대문자와 소문자를 1차적으로 구별한다. 

a 부터 z 가 순환해야 하기 때문에 아스키값 범위를 넘어가면 다시금 처음으로 돌아오도록 한다.

 

이해를 돕기 위해 예시를 들자면, 만약  X(아스키값->88) 를 4 만큼 밀었을때 아스키 값 90을 초과하므로 초과한 만큼의 값을 얻기위해 X + 4 에서 90을 빼준다. 예시에서는 88 + 4 - 90 이므로 2가 남게 된다. A에서 2만큼 더 밀어줘야하는데 

A는 아스키값으로 65 이므로 2에 64를 더해주면 된다. 이 과정은 동일하게 순환하게 해주는 값 -90+64 이므로 위에서는 간단하게 -26으로 해주었다. 

 

이보다 훨씬 간단한 코드가 있어 공유한다.

 

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("")
}

 

내가 작성한 코드보다 확실히 간결하고 이쁘다,,

 

 

잘못된 내용 있으면 댓글 부탁드립니다.

+ Recent posts