2024. 5. 9. 09:58, ๐กAlgorithm
๋ฐ์ํ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/12926

์ ๊ทผ
- ์์คํค ์ฝ๋๋ฅผ ์ด์ฉํด์ ํ๋ฉด ๋์ง ์์๊น? ์๊ฐํ๋ฉฐ ์๋์ ๊ฐ์ด ๊ตฌ์ํ๋ค.
๋์ถฉ ๊ตฌ์ํ ์ฝ๋
class Solution {
fun solution(s: String, n: Int): String {
val temp = s.split("")
var answer = temp.map { it.toInt() + n }
return answer.toString()
}
}
- ์ ์ฝ๋๋ java.lang.NumberFormatException: For input string: "" ์ค๋ฅ๊ฐ ๋จ๋ฉฐ ์๋ํ์ง ์๋๋ค.
- NumberFormatException์ด ๋ฐ์ํ๋ ์ด์ ๋ s.split("")๋ฅผ ํตํด ๋ฌธ์์ด์ ๋น ๋ฌธ์์ด("")์ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์ด์ด "abc"๋ผ๋ฉด s.split("")๋ ["", "a", "b", "c", ""]์ ๊ฐ์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค. ์ฌ๊ธฐ์ ๋น ๋ฌธ์์ด์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์, toInt() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋น ๋ฌธ์์ด("")๋ก ์ธํด NumberFormatException์ด ๋ฐ์ํ๋ค.
- ๋ฐ๋ผ์ ๋ฌธ์์ด์ ๋ถํ ํ ๋ ๋น ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ํ์ง ์๊ณ , ๊ฐ ๋ฌธ์๋ฅผ ๋ถํ ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ฌธ์์ด์ ๊ฐ ๋ฌธ์ ๋จ์๋ก ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ toCharArray() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
class Solution {
fun solution(s: String, n: Int): String {
val answer = s.toCharArray().map { (it.toInt() + n).toChar() }.joinToString("")
return answer
}
}
- ๊ทธ๋์ ์ด๋ฐ์์ผ๋ก ์์ ํ์๋๋ฐ, ์ด๋ฒ์ ํ
์คํธ์ผ์ด์ค๊ฐ ๋ฌธ์ ์๋ค.
์ค์ง "AB" "1" -> "BC" ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋์ํ๊ณ , z์์ a๋ก ๊ฐ๊ฑฐ๋ ๋์ด์ฐ๊ธฐ๋ฅผ ๋ฐ์ํ์ง๋ ๋ชปํ๋ค.
์ฑ๊ณต ์ฝ๋
class Solution {
fun solution(s: String, n: Int): String {
return s.toCharArray().map{
when(it){
in 'A'..'Z' -> {
if(it + n > 'Z') it + n - 26 else it + n
}in 'a'..'z' -> {
if(it + n > 'z') it + n - 26 else it + n
}else -> {
it
}
}
}.joinToString("")
}
}
์ค๋ช
- ์์ ์ํธ์์ ์ค์ํ ๊ฒ์ ๋ด๊ฐ ์ฒ์ ๊ตฌ์ํ๋ ๊ฒ์ฒ๋ผ ๋จ์ํ ์์คํค ์ฝ๋๊ฐ์์ n๊ฐ(๊ฑฐ๋ฆฌ)๋ฅผ ๋ํ์ง ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์ํ๋ฒณ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ ์ด์ํ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒฝ์ฐ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ 26์ ์ด์ฉํด์ ์ํ๋ฒณ์ ๋ฒ์ด๋ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค.
- string์ด์๋ s๋ฅผ char์์์ ๋ฐฐ์ด๋ก ๋ง๋ค๊ณ , ๊ฐ๊ฐ์ ์์๋ฅผ map์ผ๋ก ์ฒ๋ฆฌํ ๋ค joinToString("")์ผ๋ก ๋ฐํํ๋ค.
- A..Z ๋๋ฌธ์์์ ๋๋ฌธ์๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ ๋ํ ๊ฐ์์ 26์ ๋นผ์ค๋ค.
a..z ์๋ฌธ์์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฌธ์๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ ๋ํ ๊ฐ์์ 26์ ๋นผ์ค๋ค.
๊ณต๋ฐฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด else๋ it์ ๊ทธ๋๋ก ๋ฐํํ๋ค. - -26์ ํ๋ ์ด์ ๋ ์ํ๋ฒณ์ ์ํ์ฑ ๋๋ฌธ์ด๋ค.
์ํ๋ฒณ์ ์ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ 'Z' ๋ค์์๋ ๋ค์ 'A'๊ฐ ์จ๋ค. ๋ฐ๋ผ์ ์ํ๋ฒณ์ ์ค๋ฅธ์ชฝ์ผ๋ก n๋งํผ ์ด๋์ํฌ ๋, 'Z'๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ ๋ค์ 'A'๋ก ๋์์์ผ ํ๋ค. 'Z'์ ASCII ๊ฐ์ 90์ด๊ณ , 'A'์ ASCII ๊ฐ์ 65์ด๋ค. ๋ฐ๋ผ์ 'Z'์ 1์ ๋ํ๋ฉด 91์ด ๋๋๋ฐ, ๋ค์ ์ฒ์๋ถํฐ ์์ํ๋ ค๋ฉด -26์ ํด์ฃผ์ด์ผ ํ๋ค.
๋ฐ๋ผ์ 'Z'์์ ์ค๋ฅธ์ชฝ์ผ๋ก 1๋งํผ ์ด๋ํ ๊ฒฐ๊ณผ๋ 90 + 1 - 26 = 65๊ฐ ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ
class Solution {
fun solution(s: String, n: Int): String =
s.toList().joinToString(separator = "") {
when (it) {
in 'A'..'Z' -> ('A'.toInt() + (it.toInt() - 'A'.toInt() + n) % ('Z' - 'A' + 1)).toChar()
in 'a'..'z' -> ('a'.toInt() + (it.toInt() - 'a'.toInt() + n) % ('z' - 'a' + 1)).toChar()
else -> it
}.toString()
}
}
- A์ Z์ ์์คํค์ฝ๋์ฐจ๊ฐ 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("")
}
- 'a'..'z' ์ ๊ฐ์ด ํ๊ธฐํ์ง ์๊ณ , isLowerCase()์ isUpperCase()๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐ์ํ
๐ฌ C O M M E N T