- 문제에서의 뜻은 문자를 다음 문자로 바꿔달라는 뜻이다
- 단 소문자 z일 경우에는 소문자 a를 반환하고 공백은 그대로 공백으로 반환해야 한다고 써있다
- 이 문제를 딱 보자마자 드는 생각은 아스키 코드를 사용해야한다는 생각이 들었다
아스키 코드는 이런식으로 생겼는데 컴퓨터는 이 코드를 통해서 숫자를 영어와 특수 기호로 변경해준다는 말을 들은 적이 있다
0100000 | Space | 1000000 | @ | 1100000 | ` |
0100001 | ! | 1000001 | A | 1100001 | a |
0100010 | “ | 1000010 | B | 1100010 | b |
0100011 | # | 1000011 | C | 1100011 | c |
0100100 | $ | 1000100 | D | 1100100 | d |
0100101 | % | 1000101 | E | 1100101 | e |
0100110 | & | 1000110 | F | 1100110 | f |
0100111 | ‘ | 1000111 | G | 1100111 | g |
0101000 | ( | 1001000 | H | 1101000 | h |
0101001 | ) | 1001001 | I | 1101001 | i |
0101010 | * | 1001010 | J | 1101010 | j |
0101011 | + | 1001011 | K | 1101011 | k |
0101100 | , | 1001100 | L | 1101100 | l |
0101101 | - | 1001101 | M | 1101101 | m |
0101110 | . | 1001110 | N | 1101110 | n |
0101111 | / | 1001111 | O | 1101111 | o |
0110000 | 0 | 1010000 | P | 1110000 | p |
0110001 | 1 | 1010001 | Q | 1110001 | q |
0110010 | 2 | 1010010 | R | 1110010 | r |
0110011 | 3 | 1010011 | S | 1110011 | s |
0110100 | 4 | 1010100 | T | 1110100 | t |
0110101 | 5 | 1010101 | U | 1110101 | u |
0110110 | 6 | 1010110 | V | 1110110 | v |
0110111 | 7 | 1010111 | W | 1110111 | w |
0111000 | 8 | 1011000 | X | 1111000 | x |
0111001 | 9 | 1011001 | Y | 1111001 | y |
0111010 | : | 1011010 | Z | 1111010 | z |
0111011 | ; | 1011011 | [ | 1111011 | { |
0111100 | < | 1011100 | \ | 1111100 | | |
0111101 | = | 1011101 | ] | 1111101 | } |
0111110 | > | 1011110 | ^ | 1111110 | ~ |
0111111 | ? | 1011111 | _ | 1111111 | DEL |
그래서 적용하려고 했는데 문제점이 보인다...
1. 대문자 Z다음에 있는 특수기호
2. 만약에 대문자의 범위를 넘어갈 경우 소문자가 나올 수 있음
3. 마찬가지로 소문자 뒤에도 있는 특수기호
이거는 따로 처리를 해주어야 할 것 같다
우선 알파벳 수는 26개 일단 보이는대로 만약에 소문자 z 뒤로 n이 넘어갈 경우 이것을 다시 a로 반환해주는 작업을 진행했다
(it.code + n > 'z'.code) -> (it.code + n - 26).toChar()
이 후 대문자의 경우 'Z'를 넘어가는 경우 다시 다시 처리 하는 코드를 작성했다
(it.code + n > 'Z'.code + 1 && it.code in 'A'.code..'Z'.code) -> (it.code + n - 26).toChar()
마지막으로 공백일 경우만 예외처리 해주면 완성 바로 실행에 옮겨봤는데
7, 11, 12, 13번이 틀린거 아닌가?? 이게 왜인가 하고 여러가지 경우의 수를 생각해봐서 돌려봤는데
A..Z를 25값을 주고 넣었더니 중간에 특수 문자가 보인다..
이것이 문제가 Z 가 A를 갈 경우에 A가 나오지 않고 Z의 다음 값이 나오도록 처리가 되었다 ㅜㅜ
따라서 위에 부분에도 범위를 저장하여 나온 최종 코드는 다음과 같았다
fun solution(s: String, n: Int): String {
var answer = ""
s.forEach {
answer += when{
(it.code + n > 'z'.code) -> (it.code + n - 26).toChar()
(it.code + n in 'Z'.code + 1 ..'z'.code + 1 && it.code in 'A'.code..'Z'.code) -> (it.code + n - 26).toChar()
(it == ' ') -> ' '
else -> (it.code + n).toChar()
}
}
return answer
}
일단 생각난대로 코드를 작성해서 살짝 지저분해 보이기는 하는 것 같다
저 부분도 시간이 나면 한번 리펙토링이 필요할 것 같다 ㅋㅋㅋ
'알고리즘 > 문제풀이' 카테고리의 다른 글
(알고리즘) 멀리 뛰기 풀이 (0) | 2024.07.05 |
---|---|
(알고리즘) 기사단원의 무기 풀이 (0) | 2024.05.09 |
(알고리즘) 콜라츠 추측 문제 풀이 (1) | 2024.04.26 |