728x90
https://school.programmers.co.kr/learn/courses/30/lessons/12926
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