<알고리즘 문제풀이&연습>/[C++] 프로그래머스

[Level 3] 시저 암호 (caesar)

사용자 BlockDMask 2017. 9. 14. 00:00
반응형
  • 안녕하세요 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


감사합니다. 도움이 되셨다면 하트 한번 부탁드립니다.

반응형