어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
s | n | result |
---|---|---|
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
class Solution {
public String solution(String s, int n) {
String answer = "";
int[] c = new int[s.length()];
int ascii = 26 - n; //z + 1 = a가 되려면 26을 빼주면 된다.
for(int i = 0; i < s.length(); i++) {
c[i] = (int)s.charAt(i); // 아스키 코드를 숫자로 바꾼 값.
if(c[i] + n > 122) { // 소문자
c[i] -= ascii ;
}else if(c[i] + n > 90){ // 대문자
if(c[i] > 96) {
c[i] += n;
}else {
c[i] -= ascii;
}
}else if(c[i] == 32) { //빈칸
c[i] = 32;
} else {
c[i] += n;
}
answer += (char)c[i];
}
return answer;
}
}
이 문제는 ASCII 코드를 알아야 풀 수 있는 문제이다.
(c[i] + n > 122)
의 코드는 z다음은 a로 해주는 코드이다. c[i] -= ascii
를 해보면 b가 return되야 한다. (x의 ascii는 120) c[i] = 120 - 26 + 4가 된다.if((c[i] + n > 90)
Z의 ASCII코드는 90이다. 그러므로 90이 넘으면 A부터 다시 시작해야하는데 if(c[i] > 96)
이 코드가 없다면 소문자 a,b,c이런 낮은 수에서 에러가 발생한다.else if(c[i] == 32)
빈칸은 아무리 밀어도 빈칸이기 때문에 빈칸은 = 빈칸으로 해둔다.(char)c[i]
마지막으로 ASCII코드를 다시 character로 바꿔준다.else if(c[i] + n > 90){ // 대문자
if(c[i] > 96) {
c[i] += n;
}else {
c[i] -= ascii;
}
여기서 if(c[i] > 96) {c[i] += n;}
이 부분을 어떻게 처리를 해야하는지 고민을 많이했다. 근데 막상 코드를 짜보니.. 너무 쉬운걸 고민했던거 같다..ㅜㅜ 그리고 효율도 그다지 좋은거같지 않다..