본문 바로가기
프로그래머스/C++

[level 1] 시저 암호

by AsCE_hyunseung 2018. 9. 5.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <string>
#include <vector>
 
using namespace std;
 
string solution(string s, int n) {
    string answer = "";
 
    for (int i = 0; i < s.size(); i++)
    {
        if (64 < s[i] && s[i] < 91)//대문자일때
        {
            if ((s[i] + n) < 91 && s[i] != 32)//n만큼 밀었을때 'Z'를 초과하지 않을때
            {
                s[i] += n;
                answer.push_back(s[i]);
            }
            else if (s[i] == 32)//공백문자
            {
                answer.push_back(s[i]);
            }
            else////n만큼 밀었을때 'Z'를 초과할때
            {
                s[i] = (s[i] + n + 65- 91;
                answer.push_back(s[i]);
            }
        }
        else//소문자일때
        {
            if ((s[i] + n) < 123 && s[i] != 32)
            {
                s[i] += n;
                answer.push_back(s[i]);
            }
            else if (s[i] == 32)
            {
                answer.push_back(s[i]);
            }
            else
            {
                s[i] = (s[i] + n + 97- 123;
                answer.push_back(s[i]);
            }
        }
    }
 
    return answer;
}
cs


- 문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.


- 제한 조건

공백은 아무리 밀어도 공백입니다.

s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.

s의 길이는 8000이하입니다.

n은 1 이상, 25이하인 자연수입니다.


문제를 보고 일단 대문자 Z를 밀어서 소문자 a가 되는게 아닌 대문자 A가 되기 때문에 소문자와 대문자일때 케이스를 분리해야겠다는 생각이 들었다.

아스키 코드값에 의존해서 코딩을 했는데 코드가 복잡해지고 가독성이 떨어지는 것 같다.
다른 편리한 메소드를 썼으면 쉽게 풀 수 있었을 것 같다는 생각이 들었다.