어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요
최종 코드
class Solution {
fun solution(s: String, n: Int): String {
var answer = s.map { it->
when (it) {
in 'A'..'Z' -> {
val changeChar = it + n
if(changeChar > 'Z') {changeChar - 26}
else changeChar
}
in 'a'..'z' -> {
val changeChar = it + n
if (changeChar > 'z') {changeChar -26}
else changeChar
}
else -> it
}
}.joinToString ("")
return answer
}
}
풀이 과정
문제를 읽고 ascii 코드에 값 더하면 되는거 아닌가? 하고 바로 생각하고
var sChar = s.map{it.split("")}
이런식으로 s를 map으로 split으로 나눠서 저장한다음에 다음을 진행하려고 했는데
애초에 map을 하면 알아서 문자열을 char로 나눠서 생각하는 방식이라 저렇게 할 필요가 없었다!!!!!!
저렇게 하면 오류남 ㅋㅋ
Char이랑 String을 지금껏 막연하게 별개로 생각하고 있었는데
String은 Char의 시퀀스 라고 생각해야하는 거였다!!!!!
그래서 String은 Iterable이라고 생각해야하는 거였음!@!!!!! 완전히 머쉬베놈한테 후두부딱 맞은 느낌!!
아무튼 그래서 깨달음을 얻고 그럼 s.map 으로 바로 각 문자에 n을 더한 값을 넣어서 컬렉션으로 만들어준다음에 joinToString으로 문자열로 다시 묶어주면 되겠군 했다.
class Solution {
fun solution(s: String, n: Int): String {
var answer = s.map { it->
when (it) {
in 'A'..'Z' -> {
val changeChar = it + n
}
in 'a'..'z' -> {
val changeChar = it + n
}
else -> it
}
}.joinToString ("")
return answer
}
}
근데 또 놓친게 그 코드 범위를 넘으면 다시 A나 a로 넘어가야되는 조건이 있었음
class Solution {
fun solution(s: String, n: Int): String {
var answer = s.map { it->
when (it) {
in 'A'..'Z' -> {
val changeChar = it + n
if(changeChar > 'Z') {changeChar - 26}
else changeChar
}
in 'a'..'z' -> {
val changeChar = it + n
if (changeChar > 'z') {changeChar -26}
else changeChar
}
else -> it
}
}.joinToString ("")
return answer
}
}
그래서 만약에 각 값이 ‘z’ 나 ‘Z’ 를 넘어가면 changeChar 값에서 알파벳 개수만큼 빼면 되지않나?(확신은 없음ㅋ) 해서
a 1
b 2
c 3
b 4
e 5
f 6
g 7
h8
i9
j10
k11
l12
m13
n14
o15
p16
q17
r18
s19
t20
u21
v22
w23
x24
y25
z26
메모장에 이렇게 하나하나 적으면서 셈 ㅋㅋㅋㅋㅋㅋㅋ
걍 검색할까 하는 현타오긴했는데
뇌가 멍청하면 몸이 고생해야한다는 불변의 법칙을 어길 수는 없었음
예를들어 x(24)일때 n 이 5면 3인 c가 되어야하니까 29가 되면, 26 빼면 된다! 한 번 확인해보고
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("")
}
오 나랑 비슷한데…
대 소문자 구분을 in으로안하고 isLowerCase, isUpperCase를 사용해서 해줬고,
소문자에서는 ‘a’ 대문자에서는 ‘A’ 의 값에다가 해당 글자에서 n을 더한거에서 ‘a’의 값을 빼서 26으로 나눈 나머지를 더하는 식으로 풀었다.
스마트~~! 스마타베이비스마타~