와드의 블로그

11655번: ROT13 본문

PS/B.O.J

11655번: ROT13

Ward 2026. 3. 19. 15:48

문제

ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만듭니다. 알파벳 대문자와 소문자에만 적용되며, 그 외의 문자(숫자, 공백 등)는 변환하지 않고 그대로 유지됩니다.

  • 입력: 첫째 줄에 알파벳 대소문자, 공백, 숫자로 이루어진 문자열 S가 주어집니다. (문자열의 길이는 100을 넘지 않습니다.)
  • 출력: 입력받은 문자열 S를 ROT13으로 암호화하여 출력합니다.

풀이 1: 조건문을 활용한 직관적 풀이

문자열을 한 글자씩 순회하며 알파벳인 경우에만 13글자를 밀어서 출력하는 문제입니다. 아스키코드의 특성을 활용하여 전반부와 후반부로 나누어 직관적으로 처리합니다.

  1. 알파벳 전반부 처리: 'a'부터 'm' (또는 'A'부터 'M')까지의 문자는 아스키코드 값에 13을 더해주면(c + 13) 올바른 암호화 문자가 됩니다.
  2. 알파벳 후반부 처리: 'n'부터 'z' (또는 'N'부터 'Z')까지의 문자는 13을 더할 경우 알파벳의 범위를 벗어나게 됩니다. 이를 방지하기 위해 13을 빼는 방식(c - 13)으로 알파벳의 순환을 구현한 점이 핵심입니다.
  3. 그 외 문자 처리: 알파벳이 아닌 공백이나 숫자는 위 조건에 해당하지 않으므로, 원래 문자 그대로 StringBuilder에 덧붙입니다.

코드 1

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

       String s = br.readLine();
       StringBuilder sb = new StringBuilder();
       
       for (char c : s.toCharArray()) {
          // 1. 알파벳 전반부는 +13 처리
          if (c >= 'a' && c < 'n' || c >= 'A' && c < 'N') {
             sb.append((char)(c + 13));
          }
          // 2. 알파벳 후반부는 -13 처리로 알파벳 순환 유도
          else if (c >= 'n' && c <= 'z' || c >= 'N' && c <= 'Z') {
             sb.append((char)(c - 13));
          }
          // 3. 그 외의 문자(공백, 숫자 등)는 그대로 추가
          else {
             sb.append(c);
          }
       }

       bw.write(sb.toString());

       bw.flush();
       bw.close();
       br.close();
    }
}

풀이 2: 모듈로(나머지) 연산을 활용한 풀이

전반부/후반부를 나누지 않고, 카이사르(시저) 암호의 일반적인 공식인 나머지(%) 연산을 활용하여 일관된 로직으로 처리하는 방법입니다.

  1. 알파벳 소문자인 경우, 'a'를 빼서 0~25 사이의 인덱스로 변환합니다.
  2. 13을 더한 뒤, 알파벳 개수인 26으로 나눈 나머지(% 26)를 구합니다. 이렇게 하면 'z'를 넘어갔을 때 다시 'a'부터 시작하도록 순환시킬 수 있습니다.
  3. 다시 'a'를 더해주어 원래의 아스키코드 문자로 복원합니다. 대문자도 'A'를 기준으로 동일하게 적용합니다.

코드 2

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

       String s = br.readLine();
       StringBuilder sb = new StringBuilder();
       
       for (char c : s.toCharArray()) {
          // 소문자인 경우 모듈로 연산을 통해 13만큼 밀어내기
          if (c >= 'a' && c <= 'z') {
             sb.append((char) ((c - 'a' + 13) % 26 + 'a'));
          }
          // 대문자인 경우
          else if (c >= 'A' && c <= 'Z') {
             sb.append((char) ((c - 'A' + 13) % 26 + 'A'));
          }
          // 알파벳이 아닌 경우 그대로 유지
          else {
             sb.append(c);
          }
       }

       bw.write(sb.toString());

       bw.flush();
       bw.close();
       br.close();
    }
}

알고리즘 분류

문자열 처리 (String), 구현 (Implementation)

'PS > B.O.J' 카테고리의 다른 글

2559번: 수열  (0) 2026.03.20
9996번: 한국이 그리울 땐 서버에 접속하지  (0) 2026.03.20
1159번: 농구 경기  (0) 2026.03.19
10988번: 팰린드롬인지 확인하기  (0) 2026.03.19
2979번: 트럭 주차  (0) 2026.03.19