어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"
는 1
만큼 밀면 "BC"
가 되고, 3
만큼 밀면 "DE"
가 됩니다. "z"
는 1
만큼 밀면 "a"
가 됩니다. 문자열 s
와 거리 n
을 입력받아 s
를 n
만큼 민 암호문을 만드는 함수, solution
을 완성해 보세요.
s
는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.s
의 길이는 8000이하
입니다.n
은 1 이상, 25이하인 자연수
입니다.s | n | result |
---|---|---|
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
이 문제는 주어진 문자열의 각 문자를 n
만큼 뒤로 밀어 값을 구하는 문제입니다.
주어진 문자열에서 charAt
을 이용하여 문자열에서 문자를 추출하여 아스키코드값에 n
을 더해주면 됩니다.
하지만 이것에는 예외사항이 두 가지 존재합니다.
문자가 공백인 경우
이 경우에는 답인 문자열에 공백을 더해준 뒤 continue
를 통해 다음 문자로 넘어가줍니다.
n
을 더했을 때, 문자가 a~z
또는 A~Z
의 범위를 넘어간 경우
이 경우에는 for문
을 통해 문자에 1~n
까지 1
씩 더한 뒤 더한 문자가 z
또는 Z
라면 a
또는 A
로 변경해줍니다.
이제 코드를 보도록 하겠습니다.
String answer = "";
for ( int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
답을 저장할 answer
문자열을 준비한다.
for문
을 통해 s
에서 charAt
을 이용해 문자를 추출한다.
if ( ch == ' ') {
answer += " ";
continue;
}
만약 ch
가 공백이라면 answer
에 공백을 추가해준 뒤 continue
를 통해 뒤의 연산 코드가 실행되지 않고 다음 문자로 넘어갈 수 있게 한다.
for ( int j = 0; j < n; j++) {
if ( ch+j == 'z' || ch+j == 'Z') {
ch -= 26;
continue;
}
}
answer += (char)(ch+n);
}
return answer;
이중for문
을 사용하여 ch
에 1
씩 최종적으로는 n
만큼 더합니다.
이 때, 만약 ch+j
가 z
또는 Z
가 된다면 다음에 j
를 더할 경우 a~z
A~Z
의 범위를 벗어나기 때문에 현재 문자열에서 26
을 빼줍니다.
z
에서 a
가 되기 위해서는 25
를 빼야하는데, 왜 26
을 빼나요?
답은 for문
이 끝나고 n
을 더해주기 때문입니다.
만약 n
이 1
이고 ch
가 z
라면 결과는 a
가 나와야 하는데 z
에서 25
를 뺀다면 ch
는 a
가 되어버리고, for문
이 끝난 뒤에 answer += (char)(ch+n);
를 실행하게 되면 결과적으로 answer
에 저장되는 답은 b
가 되게 됩니다.
이렇게 범위를 벗어나는 문자에 26
을 빼주고
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 += " ";
continue;
}
for ( int j = 0; j < n; j++) {
if ( ch+j == 'z' || ch+j == 'Z') {
ch -= 26;
continue;
}
}
answer += (char)(ch+n);
}
return answer;
}
}