[프로그래머스] 시저 암호

아스키를 잘 다룬다면 쉬운 문제겠지만 잘 못다룬다면 어려운 문제일 수 있겠다. 문자열과 정수를 입력받아 정수 만큼 다음 문자로 밀어주는 (예를 들면 A가 2만큼 이동하면 C) 카이사르 암호 문제이다.

이 문제에서 잘 생각해야 하는 부분은 알파벳에서 소문자 대문자를 포함하지 않는다면 A 부터 Z까지 모두 26자 이다. 여기서 Z에서 정수 1을 받게 되면 A로 다시 돌아와야 한다. 그렇기 때문에 입력 받은 n을 밀어낼 자리 수 계산을 위해 n = n % 26 을 이용. 26(Z)이 넘어가게 되면 나머지 값 1 , 즉 A 부터 다시 출력 할 수 있게 한다.

문자열 s의 길이 만큼 반복하고, char 변수에 문자열에서 문자 하나를 받아 소문자, 대문자를 판별한다. 사용한 라이브러리 함수는 isLowerCase(), isUpperCase() 이다. boolean 타입이며 각각 소문자면 해당 문자가 소문자, 대문자면 true, false를 내보낸다.

그 후 이동시킬 알파벳 ch에서 ‘A’ 또는 ‘a’를 빼고 밀어줄 n값을 더한 후 전체 알파벳 수(26)로 나눈 나머지를 구하면 이동할 거리가 완벽하게 계산된다. 그걸 다시 초기값 ‘A’ 또는 ‘a’에 더해주면 ch 문자로부터 n만큼 이동한 알파벳이 나오게 된다. 마지막으로 입력 받았을 때 공백이 포함 된 문자열이 있으므로 공백 (ascii 값 32) 처리로 마무리 한다. ascii를 계산하는 핵심 공식을 잘 알아둬야겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public String solution(String s, int n) {
String answer = "";
n = n % 26;
for (int i=0; i<s.length(); i++){
char ch = s.charAt(i);
if (Character.isLowerCase(ch)) { //소문자면
ch = (char)((ch-'a'+n) % 26 + 'a'); //핵심 공식
}
else if (Character.isUpperCase(ch)) { //대문자면
ch = (char)((ch-'A'+n) % 26 + 'A'); //핵심 공식
}
else if (ch == 32) { //받은 문자가 공백일 때
answer += "";
}
answer = answer + ch;
}
return answer;
}
}
Author

MoonDoni

Posted on

2020-02-25

Updated on

2020-02-28

Licensed under

댓글