본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 11655 ROT13

by 해적거북 2021. 7. 27.
728x90

● [문제번호 11655] ROT13

https://www.acmicpc.net/problem/11655

 

11655번: ROT13

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

www.acmicpc.net

 

● 알아야 할 것

: 문자와 문자 계산 (ASCII 코드 참고)

 

● 풀이 과정

: 대문자와 소문자를 구분하여 구현하면 된다.

: 제대로 구현되었는 지 의문이면 문제 설명에도 쓰여있다시피 output을 input으로 실행하면 얼만큼 차이나는 지 좀 더 쉽게 알아 낼 수 있다.

 

● 주의 할 것

: 문자와 문자 계산 시 오차 수정

예를 들어 'Z' 에서 3칸 뒤의 문자는 'C' 이다

'Z' + 3 을 하면 ASCII 코드 상 다른 문자가 출력되므로 다시 'A'로 옮겨야 한다.

 

하지만 'Z' + 3 - 'A' 를 하면 'D' 가 출력된다.

이를 수정하기 위해 'Z' 를 넘어가는 경우에만 계산 결과에 1칸 앞으로 옮기면 된다.

 

따라서 'Z' 의 3칸 뒤는 'Z' + 3 - 'A' - 1 로 표현하면 된다.

 

: 이러한 오차가 왜 생기는 지 궁금하면

ASCII 코드를 보고 문자를 숫자로 바꾼다음 계산하면 완전히 이해 할 수 있다.

 

● 참고 할 것

: ASCII 코드 https://ko.wikipedia.org/wiki/ASCII

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

string str;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    // 공백 있는 문자열 입력
    getline(cin, str);
    
    for(int s = 0; s < str.length(); s++)
    {
        // 대문자인 경우
        if('A' <= str[s] && str[s] <= 'Z')
        {
            // 암호화 후 'Z'를 넘어가는 경우
            if(str[s] + 13 > 'Z')
                // 'Z'를 빼고 'A'를 더하는 과정에 오류 수정을 위한 -1
                str[s] = str[s] + 13 - 'Z' + 'A' - 1;
            else
                str[s] = str[s] + 13;
        }
        // 소문자인 경우
        if('a' <= str[s] && str[s] <= 'z')
        {
            // 암호화 후 'z'를 넘어가는 경우
            if(str[s] + 13 > 'z')
                // 'z'를 빼고 'a'를 더하는 과정에 오류 수정을 위한 -1
                str[s] = str[s] + 13 - 'z' + 'a' - 1;
            else
                str[s] = str[s] + 13;
        }
    }
    
    // 문자열 출력
    cout << str;
    
    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [203 - 자료구조 1 (참고)] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 1935 후위 표기식2 https://pirateturtle.tistory.com/170
2 1918 후위 표기식 https://pirateturtle.tistory.com/171
3 10808 알파벳 개수 https://pirateturtle.tistory.com/172
4 10809 알파벳 찾기 https://pirateturtle.tistory.com/173
5 10820 문자열 분석 https://pirateturtle.tistory.com/174
6 2743 단어 길이 재기 https://pirateturtle.tistory.com/175
7 11655 ROT13 https://pirateturtle.tistory.com/176
8 10824 네 수 https://pirateturtle.tistory.com/177
9 11656 접미사 배열 https://pirateturtle.tistory.com/178

 

728x90

댓글