[백준 / 11655 / C++] ROT13

Park·2023년 10월 17일
0

코딩테스트 - Week1

목록 보기
14/15

1. 문제 접근

  • 'Z'나 'z'에 13을 더하면, 그 다음 아스키코드 값이 나오는 것이 아니라, 다시 알파벳을 순회해야 한다.
  • 따라서 원형 큐를 통해 풀어야겠다고 접근

2. 시행착오

  • 문자열을 char 배열에 담을 때, 항상 배열의 크기를 +1해야 오류가 안생긴다는 점을 간과
    • C++, C에서 문자는 null로 종료되는 것이 원칙이므로 마지막에 무조건 널문자인 '\0'에 해당하는 바이트가 붙음

3. 코드 및 풀이

3.1 배열과 원형 큐 방식으로 풀이

  • 소문자, 대문자 case를 나눠서 원형 큐 방식으로 접근하도록 했다.
  • 예를 들어 만약 'Z'(아스키코드 기준 90) 이 들어오면, 90 - 65('a') + 13의 결과에 mod 26 연산을 해서 'M'이 나오도록 하였음
#include <bits/stdc++.h>
using namespace std;

char arr[101];
string s;

int main(){

    // 1. input
    getline(cin, s);

    // 2. string to arr
    for(int i = 0; i < s.size(); i++){
        // 2.1 If char is not integer shape
        char tmp = s[i];
        if ( 'a' <= tmp && tmp <= 'z') arr[i] = (char) ((tmp - 'a' + 13) % 26 + 'a');
        else if ('A' <= tmp && tmp <= 'Z') arr[i] = (char) ((tmp - 'A' + 13) % 26 + 'A');
        else arr[i] = tmp;
    }

    // 3. print
    // for(char c: arr) cout << c << "";
    for(int i = 0; i < s.size(); i++) {
        cout << arr[i] << "";
    }

    return 0;
}

3.2 단순 조건문

  • if 조건문을 여러개 사용해, 바로 결과값을 출력하도록 할 수 있음
  • 또한 배열을 사용해 값을 저장하지 않고 바로 출력하는 방식으로 해결할 수 있음
#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; 
}

Reference

profile
안녕하세요!

0개의 댓글