본문 바로가기
알고리즘/프로그래머스

프로그래머스 시저 암호 (level.3)

by 코리늬 2018. 2. 26.

문제 : 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.

A를 3만큼 밀면 D가 되고 z를 1만큼 밀면 a가 됩니다. 공백은 수정하지 않습니다.

보낼 문자열 s와 얼마나 밀지 알려주는 n을 입력받아 암호문을 만드는 caesar 함수를 완성해 보세요.

“a B z”,4를 입력받았다면 “e F d”를 리턴합니다.


이 문제를 보자마자 a와 A가 아스키 코드 몇이더라..ㅎ 까먹어서 찾아보았다.

이 문제에서 필요한 알파벳들의 아스키코드를 보면

아스키코드 전체는 0~127까지

알파벳은 26개, 대문자 A와 a 는 32 차이

A= 65~96부터

a= 97~122다.


charAt을 사용하여 첫번째 문자를 추출하고

Character.isUpperCase()를 사용 대문자인지 구별하고

Character.isLowerCase()를 사용 소문자인지 구별

해당하는 아스키코드 값 연산 순서로 풀 수 있습니다.


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
class Caesar {
    String caesar(String s, int n) {
        String result = "";
        n = n%26//밀어낼 자리수 n의 계산
        int cs = s.length(); //cs = 5 , 공백도 똑같이 출력해줘야하기 때문에 그냥 length로 받음
        
        for(int i=0; i<s.length(); i++) {
            char ch = s.charAt(i);    //하나씩 저장
            if(Character.isLowerCase(ch)) {
                // 계산시 -'a'와 +'a'를 해줘야 하는 이유에 대해 파악해야함
                ch = (char) ((ch-'a'+n) % 26 +'a'); 
                
            }else if(Character.isUpperCase(ch)) {
                ch = (char) ((ch-'A'+n) % 26 +'A');
                
            }
            result = result + ch;
            
        }
        
        // 함수를 완성하세요.
        
        return result;
    }
 
    public static void main(String[] args) {
        Caesar c = new Caesar();
        System.out.println("s는 'a B z', n은 4인 경우: " + c.caesar("a B z"4));
    }
}
cs

주석으로 설명을 해놓았지만 아무래도 이 문제에서는 아스키 값을 연산하는 방법이 가장 중요했던 것 같다.

입력받은 수에서 첫 자리인 'a' , 'A' 값을 빼고 더해줄 자리수를 더한 후, 그걸 전체 알파벳 수로 나눠 나머지를 구하면 이동할 거리에 대한 계산이 완벽하게 이루어져 다시 초기값  'a' , 'A'에 더해주면 이동한 자리의 값이 나오게 되는 것입니다.

댓글