문제
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
A를 3만큼 밀면 D가 되고 z를 1만큼 밀면 a가 됩니다. 공백은 수정하지 않습니다.
보낼 문자열 s와 얼마나 밀지 알려주는 n을 입력받아 암호문을 만드는 caesar 함수를 완성해 보세요.
a B z, 4
를 입력받았다면 e F d
를 리턴합니다.
풀이
가끔 코딩 테스트보면 나오는 문제 형태인 것 같은데 아스키 코드 값으로 접근하면 된다.
A(65) ~ Z(90), 그리고 a(97) ~ z(122)를 기준으로 생각하고 나머지 값에 대해서는 있는 그대로 출력해주면 된다.
프로그래머스에서는 나머지 값이 공백으로 통일된 것 같고 한 가지 주의할 점이 n의 값이다.
처음에는 Z이후에 다시 A로 돌아와야 하므로 알파벳 개수(26)만큼 빼주면 될 줄 알았는데
n이 마이너스일 경우도 가정하여 26만큼 더해주는 과정도 필요하다.
그리고 좀 헤맸던 부분인데 n이 26보다 큰 값 또는 -26보다 작은 값일 경우도 생각해야 했다…
그런데 26보다 큰 값이나 -26보다 작은 값.. 예를 들어 261이라는 숫자가 n 값으로 들어온다고 가정해보면
이것은 결국 26을 몇바퀴 돌고 나머지인 26만큼 10번 로테이트 하고 이동은 A->B로 1칸 밖에 안한 것이다.
따라서 n의 값을 미리 변경해주고 시작하자. 우리는 얼마만큼 변경할지 변경할 값만 알면 되니까…
이걸 미리 안하고 계산하면 꾀나 복잡해질 것이다.. char값 범위를 넘어가는 처리 등등..
소스 코드
#include <iostream>
#include <string>
using namespace std;
string caesar(string s, int n)
{
string answer = "";
for (int i = 0; i < s.length(); i++)
{
char data = s.at(i);
n %= 26;
if (data >= 65 && data <= 90)
{
if (data + n > 90)
data -= 26;
if (data + n < 65)
data += 26;
data += n;
}
else if (data >= 97 && data <= 122)
{
if (data + n > 122)
data -= 26;
if (data + n < 97)
data += 26;
data += n;
}
answer += data;
}
return answer;
}
int main()
{
string text = "abc ABC xyz XYZ";
int testNo = 26 * 12312 + 12;
string testAnswer = caesar(text, testNo);
cout << testAnswer;
}
알고리즘 문제 Level 3 | 프로그래머스
'Algorithm' 카테고리의 다른 글
최소자승합(제곱의 합) 구하기 (0) | 2018.12.27 |
---|---|
엔터까지 N개의 숫자 입력 받기 - C++ (0) | 2018.12.27 |
행렬의 곱셈 (0) | 2018.12.27 |
2016년 요일 구하기 (0) | 2018.12.27 |
콜라츠 추측 (0) | 2018.12.27 |