[C++] 프로그래머스 시저 암호
2020. 12. 4.
반응형

programmers.co.kr/learn/courses/30/lessons/12926

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가

programmers.co.kr

1. 서론

 

간단하게 풀긴 했는데 사람에 따라서는 어려울 수도 있는 level 1문제다. 왜 그렇냐고 하면 난 학부시절 이와 비슷한 시저 암호 문제를 과제로 해본 적이 있기 때문에 이해나 접근이 쉬웠다. 아닌 사람은 어떨지 잘 모르겠다.

 

2. 문제 풀이

 

시저 암호를 이용한 문제이다. 시저 암호라는 것은 원래 문자열을 일정한 규칙을 가지고 뒤엎어 알아볼 수 없게 만들어 암호화하는 것이다.

문자열이 주어지고, 숫자가 주어진다. 그 숫자만큼 알파벳 순서를 뒤로 밀어서 새로운 문자열을 만드는 게 문제이다.

키 포인트는 문자열을 제대로 미루는 것과, 공백을 처리하는 것 그리고 Z에서 다시 A 범위로 넘어가는 것이다.

위의 세 개의 포인트만 해결하면 정말 쉬운 문제이다.

 

나는 대문자, 소문자의 알파벳을 미리 문자열로 만들었다. 그리고 공백은 미리 따로 처리하고 대소문자 구분 후 문자형 단위로 문자열을 쪼개서 미리 만들어 둔 알파벳 문자열에서 원래 위치를 찾는다. 그리고 그 위치에서 주어진 숫자를 더해 시저 암호를 구한다. 이때 범위가 넘어갔을 때 다시 앞으로 돌아가도록 처리해줘야 에러가 나지 않는다.

 

3. 코드 설명

 

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    string s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string s2 = "abcdefghijklmnopqrstuvwxyz";
    int i, x;
    
    for (i = 0; i < s.size(); i++)
    {
        if (s[i] == ' ')
            answer += ' ';
        
        else if (isupper(s[i]))
        {
            x = s1.find(s[i]);
            x += n;
            
            if (x >= 26)
                x -= 26;
            
            answer += s1[x];
        }
        else
        {
            x = s2.find(s[i]);
            x += n;
            
            if (x >= 26)
                x -= 26;
            
            answer += s2[x];
        }     
    }
  
    return answer;
}

 

조금 복잡하게 풀었나 싶은데 다들 나랑 비슷하게 풀어서 그냥... ㅎ

s1, s2는 각각 대, 소문자를 미리 적어둔 문자열이다.

공백에는 공백을 넣어준다.

그리고 대, 소문자인지 구분해서(isupper함수) 각각 s1, s2에서 해당 문자의 위치를 찾는다. (find 함수)

찾은 후 주어진 숫자인 n을 더해서 시저 암호화한다. 이 경우에 z 뒤로 숫자가 넘어가는 경우가 생기기 때문에 26보다 큰 경우에는 빼줘서 다시 앞자리로 돌아갈 수 있도록 범위를 조정해준다.

 

 

 

 

 

 

 

 

반응형
myoskin