연습문제
🔥 시저암호 🔥
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방법을 시저암호라고 한다.
문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수 solution을 완성해보자.
s | n | result |
---|---|---|
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
- 내가 추가한 테스트케이스 - | ||
"Z" | 1 | "A" |
"P" | 15 | "E" |
"P" | 20 | "J" |
class Solution {
public String solution(String s, int n) {
String answer = "";
char[] c = s.toCharArray();
int[] d = new int[c.length];
for(int i=0;i<c.length;i++){
d[i] = (int)c[i]+n;
if(d[i]-n == 32){//공백이라면
answer+= " ";
}else if(90<d[i] && 64<d[i]-n && d[i]-n < 91){
answer += (char)(65+d[i]-91);
}else if(d[i]>122){
answer += (char)(97+d[i]-123);
}
else{
answer += (char)(d[i]);
}
}
return answer;
}
}
문제를 보자마자 이건아스키코드다! 라고 생각은 했지만 내가 외우고 다니지는 않기에 바로 아스키코드부터 검색했다.
이제부터는 조건에 따라서 answer에 더하는 방식이다.
아스키코드의 값이 공백이라면 answer에 " "를 더해준다.
d[i]의 값이 90보다 크다는 것은 대문자 Z보다 큰 값이라는 것이다. 대입된 문자가 대문자인데 n을 더한 문자가 Z보다 뒤에있는 문자라면 answer에 (65+d[i]-91)의 값을 더해주는 것이다.
그리고 d[i]>122는 아스키코드가 소문자 z보다 커지는 경우로 answer에 (97+d[i]-123)을 더해준다.
풀기는 했지만 비효율적이고 지저분한 코드라는 것은 알 수 있었다.
class Solution {
public String solution(String s, int n) {
String answer = "";
for(char ch : s.toCharArray()) {
if(ch==' ') {
answer += ch;
}else if(ch>='a'&& ch<='z'){
answer += (char)('a' + (ch+n-'a')%26);
}else {
answer += (char)('A' + (ch+n-'A')%26);
}
}
return answer;
}
}
와우... 불필요한 변수도 알아보기 힘든 조건도 없는 너무 깔끔 코드 ✨
공백이라면 answer에 바로 더해준다.
ch의 값이 a~z 라면
answer += (char)('a' + (ch+n-'a')%26);
answer += (char)('A' + (ch+n-'A')%26);
저런 생각을 왜 못할까