본문 바로가기
백준

[백준] 11655번 : ROT13 – JAVA [자바]

by Hongwoo 2023. 2. 14.
반응형

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

 

11655번: ROT13

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 11655번 ROT13은 브론즈 1 난이도의 구현 및 문자열 문제이다. 이 문제에서는 문자열이 주어졌을 때 "ROT13"으로 암호화한 내용을 출력하면 된다.

 

이 문제는 아스키코드를 이용해서 간단하게 풀 수 있다. 우선 ROT13 암호화란 한 문자를 13 글자씩 미는 암호화 방법이다. 예를 들어서 A는 13글자 밀어서 N이 되고, B는 13글자 밀어서 O가 된다. 다만, 이 문제에서는 대문자는 대문자로, 그리고 소문자는 소문자로 남아야 한다. 따라서 밑에 있는 아스키 표처럼 Z를 13글자 밀면 g가 되는데 대문자로 남아야 하기 때문에 M이 되어야 한다. 

 

 

우선 자바에서 char형태를 아스키코드로 변환하려면 타입 변환 (캐스팅)을 하면 된다. 예를 들어서 char 형 문자인 c가 있다고 하겠다. 그러면 (int) c를 하면 이 c의 아스키코드를 얻을 수 있다.

 

따라서, ROT13 암호화를 하려면 (int) (c + 13)을 하면 된다. 다만, 대문자는 대문자로 남아야 하고, 소문자는 소문자로 남아야하기 때문에 대문자일 때 13을 더했을 때 가장 큰 Z의 90보다 크면 26을 빼주면 된다. 소문자도 마찬가지로 13을 더했을 때 122보다 크면 26을 빼주면 된다.

 

자세한 코드는 아래에 있는 코드를 참고하면 되겠다.

 


  • 코드

 

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));
        StringBuilder sb = new StringBuilder();
        String s = br.readLine();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!Character.isLetter(c)) {
                sb.append(c);
                continue;
            }
            int n = (int)c + 13;
            
            //대문자일 때 90보다 크면 26 빼기
            if (Character.isUpperCase(c) && n > 90) {
                n -= 26;
            }
            
            //소문자일 때 122보다 크면 26 빼기
            if (Character.isLowerCase(c) && n > 122) {
                n -= 26;
            }
            sb.append((char)n);
        }
        System.out.print(sb);
    }
}

 

반응형

댓글