[백준, 자바] 11655번 - ROT13

jinvicky·2023년 12월 11일
0

ALG

목록 보기
14/62

ROT13

알파벳 + 13을 해서 문자열을 암호화하기.

package src.baekjoon;

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));
        int N = 26; //알파벳 배열의 길이
        Character[] lowerArr = new Character[N];
        Character[] upperArr = new Character[N];

        //알파벳 배열 초기화
        for (int i = 0; i < N; i++) {
            int low = 97;
            int upp = 65;

            lowerArr[i] = (char) (i + low);
            upperArr[i] = (char) (i + upp);
        }

        String input = br.readLine();

        for (int i = 0; i < input.length(); i++) {
            Character ch = input.charAt(i);
            int ascCode = 0;

            if (ch - 97 >= 0) { //소문자
                ascCode = (int) (ch - 97);
                int tmp = ascCode + 13 >= N ? Math.abs(N - (ascCode + 13)) : ascCode + 13;
                bw.append(lowerArr[tmp]);
            } else if (ch >= 'A' && ch <= 'Z') { //대문자
                ascCode = (int) (ch - 65);
                int tmp = ascCode + 13 >= N ? Math.abs(N - (ascCode + 13)) : ascCode + 13;
                bw.append(upperArr[tmp]);
            } else { // 빈 공백일 경우 그대로 더한다.
                bw.append(ch);
            }
        }
        bw.flush();
        bw.close();
    }
}

결과

정답

풀이

또한 알파벳 대소문자 구별을 코드값 계산 비교 또는 문자 비교로 할 수 있다.
1. 아스키코드 - 97이 0보다 크거나 같으면 소문자이다.
2. ch가 'A'보다 크거나 같고 'Z'보다 작거나 같으면 대문자이다.

난 대소문자 알파벳 배열을 별도로 선언했는데, 정답 이후 다른 풀이를 보니 그럴 필요는 없었다.

해결

'출력 형식이 잘못되었습니다' 에러가 여러번 발생했었다.
결과적으로 찾아보니 알고리즘은 맞았으나 불필요하게 StringTokenizer를 사용해서 띄어쓰기 출력에 문제가 있었던 것이다. (사실 출력은 잘 나와서 의아했다.)

StringTokenizer를 사용하지 말고, 알파벳 대소문자가 아니라면 그대로 bw.append()를 하면 된다.

참고

문자 <-> 숫자가 헷갈린다면 아래 링크를 참고하자.
https://blog.naver.com/PostView.nhn?blogId=jysaa5&logNo=221831226674

rot13에 관한 풀이 중 깔끔한 것
https://broship.tistory.com/181

소요 시간

약 1시간 30분

profile
일단 쓰고 본다

0개의 댓글