어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열
s
와 거리n
을 입력받아s
를n
만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
- 공백은 아무리 밀어도 공백입니다.
s
는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.s
의 길이는 8000이하입니다.n
은 1 이상, 25이하인 자연수입니다.
✅ 공백은 밀어도 공백이므로
" "
을 그대로 사용하고, 알파벳인 경우n
만큼 밀어줘야 한다.
문자를n
만큼 밀었을 때의 값인ch
가 대문자인 경우 90을 넘으면Z
를 넘어간다는 뜻이므로 다시A
로 돌아가야 한다. 이를A
에ch-90-1
을 더해주는 방식으로 구현하였다. 이 때, 소문자는 97부터 시작하므로 기본값이 90을 넘어가기 때문에, 조건에arr[i]
가 대문자일 때만 동작하도록 추가 조건을 넣어줬다.
문자가 소문자인 경우에는 122를 넘으면z
를 넘어간다는 뜻이므로 소문자와 동일하게a
에ch-122-1
을 더해주었다. 이러한 연산을 거친ch
는 int 타입이므로 char 타입으로 형변환하여 문자열에 더해줘야 한다.
class Solution {
public String solution(String s, int n) {
String answer = "";
char[] arr = s.toCharArray();
for(int i=0;i<arr.length;i++) {
if(arr[i] == ' ') {
answer += " "; continue;
}
int ch = arr[i] + n;
if(ch > 90 && arr[i] <= 90) ch = 65 + (ch-91);
else if(ch > 122) ch = (97 + (ch-123));
answer += String.valueOf((char)ch);
}
return answer;
}
}
➕ 다른 사람의 코드 :
isUpper/LowerCase()
를 통해 대소문자를 판별하고, 나머지 연산을 통해서 간단하게 밀린 값에 대한 문자를 구할 수 있었다. 근데 Wrapper 클래스를 사용해서 계속 판별하다 보니 시간이 좀 오래 걸리는 것 같다.
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(Character.isUpperCase(ch)) {
ch = (char) ((ch - 'A' + n) % 26 + 'A');
} else if(Character.isLowerCase(ch)) {
ch = (char) ((ch - 'a' + n) % 26 + 'a');
}
answer += ch;
}
return answer;
}
}