안녕하세요 BlockDMask 입니다.
오늘은 Level 3에 있는 시저 암호 라는 문제를 풀어보았습니다.
빨리 level 3 풀고 4, 5, 6, ~~~ 쭉쭉 넘어가고 싶네요.
0. 문제
Programmers Level 3 시저 암호
Programmers Level 3 Caesar Code
1. 문제설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라 한다.
a를 4만큼 밀면 e가 되고
Z를 2만큼 밀면 A가 된다.
입력이 문자열이 들어오고, 공백은 수정하지 않는다.
시저암호로 변경된 문자열을 출력하면 됩니다.
2. 풀이과정
string으로 들어오는 문자열을 const char * 타입의 char 배열로 만들어서 다룰 생각을 했습니다.
그 다음 알파벳을 n 만큼 더하여서 출력을 하면 되는 간단한 알고리즘 입니다.
여기서 생각해야할 것이.
1) 대문자, 소문자 인지
2) z, Z 의 범위를 넘어서 다시 a, A 로 돌아오는 경우.
이 두가지 입니다.
알파벳에 소문자면 'a', 대문자면 'A'를 빼주어서 숫자 0~25 사이의 값으로 만들어 줍니다.
알파벳의 개수인 26으로 나누어 나머지를 구합니다.
이렇게 해주는 이유는 n 의 값이 상당히 커지면 몇바퀴를 돌지 모르기 때문입니다.
26으로 나눈 나머지는 0~25 사이의 값이 나옵니다.
그 알파벳을 소문자면 'a', 대문자면 'A'를 다시 더해주어 아스키 코드 값에 맞게 고쳐줍니다.
3. 코드
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string caesar(string s, int n) {
string answer = "";
const char * str = s.c_str();
//str[i] 값을 0~25 사이의 값(알파벳 갯수 26개)으로 만들고 n 만큼 더합니다.
//더한 값을 알파벳 갯수인 26 으로 나누어서 나머지를 구한다. (n의 값이 크면 몇바퀴를 돌지 모르기 때문에)
//나머지에 소문자면 'a'를 대문자면 'A'를 더해서 아스키 코드 값을 맞춘다.
for(int i=0; i<s.size(); i++){
//소문자 일때
if(str[i] <= 'z' && str[i] >= 'a'){
answer += ((str[i] - 'a' + n)%26) + 'a';
//대문자 일때
}else if(str[i] <= 'Z' && str[i] >= 'A'){
answer += ((str[i] - 'A' + n )%26) + 'A';
//알파벳이 아닐때
}else{
answer += str[i];
}
}
return answer;
}
int main() {
string text = "a B z";
int testNo = 4;
string testAnswer = caesar(text, testNo);
cout<<testAnswer;
}
4. 인증
<문제출처>
https://programmers.co.kr/learn/challenge_codes/144
감사합니다. 도움이 되셨다면 하트 한번 부탁드립니다.
'<알고리즘 문제풀이&연습> > [C++] 백준, 프로그래머스 등등' 카테고리의 다른 글
[백준 2908] 상수 (4) | 2017.09.17 |
---|---|
[백준 2675] 문자열 반복 (0) | 2017.09.17 |
[Level 4] 숫자의 표현 (0) | 2017.09.15 |
[Level 3] 멀리 뛰기 (jumpCase) (0) | 2017.09.14 |
[Level 3] 다음 큰 숫자 (nextBigNumber) (0) | 2017.09.12 |
[백준 1912] 연속합 (수열) (0) | 2017.09.12 |
[백준 11004] K번째 수 (0) | 2017.09.08 |
[백준 10845] 큐 (C, C++ Queue) (6) | 2017.08.21 |