programmers.co.kr/learn/courses/30/lessons/12926
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보다 큰 경우에는 빼줘서 다시 앞자리로 돌아갈 수 있도록 범위를 조정해준다.
'Algorithm' 카테고리의 다른 글
[C++] 프로그래머스 약수의 합 (0) | 2020.12.04 |
---|---|
[C++] 프로그래머스 내적 (0) | 2020.12.04 |
[C++] 프로그래머스 문자열을 정수로 바꾸기 (0) | 2020.12.03 |
[C++] 프로그래머스 수박수박수박수박수박수? (0) | 2020.12.03 |
[C++] 프로그래머스 소수 찾기 (with 에라토스테네스의 체) (0) | 2020.11.18 |