시저 암호

문제정의


시저 암호를 프로그래밍하는 문제이다. 시저 암호를 만드는 방법은 문자열을 아스키코드로 n만큼 미뤄서 만들면 된다. 가령 abc가 있고 2가 주어진다면 cde이런식으로 만들 수 있다. 문제에서 알파벳에 대해서만 만들고 공백은 건들지 말라 했으므로, 알파벳에 대해서만 처리를 해주면 된다.

문제풀이


전체 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class CaesarCode {

//프로그래머스 문제풀이 level1 시저 암호
public static void main(String[] args)
{
String s = "AB";
int n = 1;
StringBuffer buff = new StringBuffer();
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
int ascii = (int) c;
if(ascii >= 65 && ascii <= 90)
{
ascii += n;
if(ascii > 90)
ascii -= 26;
}
else if(ascii >= 97 && ascii <= 122)
{
ascii += n;
if(ascii > 122)
ascii -= 26;
}
buff.append(String.valueOf((char) ascii));
}
String answer = buff.toString();
}
}

문자열을 문자로 하나씩 뜯어서 본다. 만약 대문자라면 90을 넘어갈 경우 대문자 A로 돌아가야 한다. 따라서 첫번째 if문을 보면 대문자에 속할 경우 n을 더하고 Z의 아스키코드를 넘아가면 A로 돌아가게 하였다. 두번째 if문도 똑같은 원리로 하면 된다. 공백의 경우 아스키코드를 늘릴 필요가 없으므로 그대로 추가하면 된다. 총 시간복잡도는 \(O(n)\)이다.

테스트



필자의 경우 26을 빼주는 식으로 했는데 조금 다르게 풀 수도 있다. 주어진 문자가 소문자인지 대문자인지 판별한 후에(자바에는 친절하게 이 메소드를 제공한다.) 만약 소문자라면

((c - 'a')+n)%26 + 'a'

이런식으로 구할 수도 있다.