Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코딩테스트사이트추천
- til
- 1일1코테
- 코드트리
- 코딩테스트준비
- 데이터베이스
- 연결 리스트
- 코딩테스트
- 오블완
- C
- 99클럽
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 개발자루틴
- 갭체크
- Java
- 파이썬
- 개발자취업
- 플로이드-워셜
- 운영체제
- 항해99
- 코테공부
- 자바스크립트
- 자료구조
- 웹
- 인접 행렬
- 프로그래머스
- 알고리즘
- 프로그래밍 언어
- 자바
- 티스토리챌린지
Archives
- Today
- Total
와드의 블로그
11655번: ROT13 본문
문제
ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만듭니다. 알파벳 대문자와 소문자에만 적용되며, 그 외의 문자(숫자, 공백 등)는 변환하지 않고 그대로 유지됩니다.
- 입력: 첫째 줄에 알파벳 대소문자, 공백, 숫자로 이루어진 문자열 S가 주어집니다. (문자열의 길이는 100을 넘지 않습니다.)
- 출력: 입력받은 문자열 S를 ROT13으로 암호화하여 출력합니다.
풀이 1: 조건문을 활용한 직관적 풀이
문자열을 한 글자씩 순회하며 알파벳인 경우에만 13글자를 밀어서 출력하는 문제입니다. 아스키코드의 특성을 활용하여 전반부와 후반부로 나누어 직관적으로 처리합니다.
- 알파벳 전반부 처리: 'a'부터 'm' (또는 'A'부터 'M')까지의 문자는 아스키코드 값에 13을 더해주면(c + 13) 올바른 암호화 문자가 됩니다.
- 알파벳 후반부 처리: 'n'부터 'z' (또는 'N'부터 'Z')까지의 문자는 13을 더할 경우 알파벳의 범위를 벗어나게 됩니다. 이를 방지하기 위해 13을 빼는 방식(c - 13)으로 알파벳의 순환을 구현한 점이 핵심입니다.
- 그 외 문자 처리: 알파벳이 아닌 공백이나 숫자는 위 조건에 해당하지 않으므로, 원래 문자 그대로 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: 모듈로(나머지) 연산을 활용한 풀이
전반부/후반부를 나누지 않고, 카이사르(시저) 암호의 일반적인 공식인 나머지(%) 연산을 활용하여 일관된 로직으로 처리하는 방법입니다.
- 알파벳 소문자인 경우, 'a'를 빼서 0~25 사이의 인덱스로 변환합니다.
- 13을 더한 뒤, 알파벳 개수인 26으로 나눈 나머지(% 26)를 구합니다. 이렇게 하면 'z'를 넘어갔을 때 다시 'a'부터 시작하도록 순환시킬 수 있습니다.
- 다시 '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 |