포스트

Pr.11655 ROT13

Pr.11655 ROT13

문제

ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.</br> 예를 들어, “Baekjoon Online Judge”를 ROT13으로 암호화하면 “Onrxwbba Bayvar Whqtr”가 된다. ROT13으로 암호화한 내용을 원래 내용으로 바꾸려면 암호화한 문자열을 다시 ROT13하면 된다. 앞에서 암호화한 문자열 “Onrxwbba Bayvar Whqtr”에 다시 ROT13을 적용하면 “Baekjoon Online Judge”가 된다.</br> ROT13은 알파벳 대문자와 소문자에만 적용할 수 있다. 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다. 예를 들어, “One is 1”을 ROT13으로 암호화하면 “Bar vf 1”이 된다.</br> 문자열이 주어졌을 때, “ROT13”으로 암호화한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열 S가 주어진다. S의 길이는 100을 넘지 않는다.

출력

첫째 줄에 S를 ROT13으로 암호화한 내용을 출력한다.

예제 입력

1
Baekjoon Online Judge

예제 출력

1
Onrxwbba Bayvar Whqtr

풀이과정

전제조건

  1. 시간 복잡도, 공간 복잡도
    • 배열의 크기가 100을 넘지 않는다.
    • for문을 통해 최대 100번 반복 O(100)이다.
  2. 최대, 최소 조건
    • 최대 100, 최소 0
  3. 사용 알고리즘
    • 단순 구현 문제
  4. 반례
    • z 인 경우 ->

제출 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
using namespace std;

string s, result;

int main(){
    getline(cin, s);
    for(int i = 0; i < s.size(); i++){
        if(s[i] >= '0' && s[i] <= '9'){
            result += s[i];
        }
        else if(s[i] >= 'A' && s[i] <= 'Z'){
            result += (s[i] - 'A' + 13) % 26 + 'A';
        }
        else if(s[i] >= 'a' && s[i] <= 'z'){
            result += (s[i] - 'a' + 13) % 26 + 'a';
        }
        else{
            result += s[i];
        }
    }
    cout << result <<'\n';
    return 0;
}

해설

생각해볼 점

1
- 아스키 코드 : A = 65, a = 97

수정방안

1
2
3
4
5
6
- 뺄셈을 활용(교안 정답)
> 대문자는 65 + 26 = 81이 넘어가면 26 만큼 빼준다.
> 소문자는 97 + 25 = 122가 넘어가면 26 만큼 빼준다.

- 나머지를 활용(내가 푼 방법)
> A(a)만큼 빼주고 26을 나누고 다시 a를 더해준다. 

정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;   
string s; 
int main(){
    getline(cin, s); 
    for(int i = 0; i < s.size(); i++){
        // 대문자인경우
        if(s[i] >= 65 && s[i] < 97){
            if(s[i] + 13 > 90) s[i] = s[i] + 13 - 26; 
            else s[i] = s[i] + 13;  
        }else if(s[i] >= 97 && s[i] <= 122){
            if(s[i] + 13 > 122)s[i] = s[i] + 13 - 26; 
            else s[i] = s[i] + 13;  
        }
        cout << s[i];  
    } 
    return 0; 
}

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.