알파벳
, 문자열의 거리
라는 키워드를 보면 바로 아스키코드
를 떠올릴 수 있을 것이다.
- A(65) ~ Z(90)
- a(97) ~ z(122)
문제에 주어진 예시처럼 z를 4만큼 밀게되면 z -> a -> b -> c -> d
이기 때문에 d가 된다. z는 122이고 d는 100인데 알파벳이 26글자이기 때문에 122-26+4
를 해서
class Solution {
public String solution(String s, int n) {
String answer = "";
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(ch == ' ') {
answer += ch;
continue;
}
if(ch >= 'a' && ch <= 'z') {
if(ch + n > 'z') {
answer += (char)(ch - 26 + n);
} else {
answer += (char)(ch + n);
}
} else if(ch >= 'A' && ch <= 'Z') {
if(ch + n > 'Z') {
answer += (char)(ch - 26 + n);
} else {
answer += (char)(ch + n);
}
}
}
return answer;
}
}
사실 대/소문자에 상관없이 해줘야하는 연산이 같기 때문에 조건문을 일일이 써주는 게 맞는지에 대한 고민을 계속 했다.
(char)(ch - 26 +n) 과 (char)(ch + n)
다른 사람들의 풀이를 보고나서야 isUpperCase()
와 isLowerCase()
가 떠올랐다.
시저암호가 진짜 존재하는 건지 궁금해서 찾아보니 정말 존재하는 암호화 방식이었다.
사실 이 문제의 이름인 시저 암호
는 카이사르 암호
라고도 부르는 고대 암호로 문제의 내용대로 key값을 받아 해당 숫자만큼 평문을 쉬프트해주는 치환암호이다. 쉽게 사용할 수 있는 대신 철자의 빈도와 자주 사용되는 단어, 형태를 이용해서 쉽게 풀린다는 단점이 있다고 한다.