시저 암호 문제 풀이 (Java)
문제 설명
문자열 s와 정수 n이 주어질 때, 각 알파벳을 n만큼 밀어서 만든 시저 암호 문자열을 반환하는 문제
예를 들어:
"AB"를 1만큼 밀면"BC""z"를 1만큼 밀면"a"
풀이 아이디어
- 문자열을 한 글자씩 확인한다.
- 알파벳이면
n만큼 민다.- 대문자
'A' ~ 'Z'→ 65 ~ 90 - 소문자
'a' ~ 'z'→ 97 ~ 122
- 대문자
- 범위를 벗어나면
% 26을 이용해 순환 처리한다. - 공백
' '은 그대로 둔다.
코드
class Solution {
public String solution(String s, int n) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == ' ') {
sb.append(' ');
} else if (c >= 'A' && c <= 'Z') {
// 대문자 처리
char shifted = (char) ((c - 'A' + n) % 26 + 'A');
sb.append(shifted);
} else if (c >= 'a' && c <= 'z') {
// 소문자 처리
char shifted = (char) ((c - 'a' + n) % 26 + 'a');
sb.append(shifted);
}
}
return sb.toString();
}
}
동작 원리
1. 'y' - 'a' = 24 (인덱스 구하기)
2. 24 + 3 = 27 (3만큼 이동)
3. 27 % 26 = 1 (순환 → b)
4. 1 + 'a' = 98 → 'b'
5. 최종 결과: 'b'
자바의 자동 형 변환
c와 'a'는 둘 다 char 타입인데, 왜 c - 'a' 같은 계산이 바로 int형으로 가능할까? 라는 의문이 들었다...
이는 자바의 자동 형 변환(Type Promotion) 덕분이다.
분명 형변환을 공부했었는데 또 코테를 풀다보니 연동이 잘안된다.
꾸준히 푸는 것이 정말 중요하다는 것을 또 한번 느꼈다.
char → int 변환
• char는 내부적으로 유니코드 정수 값을 저장.
• 산술 연산 시 자동으로 int로 변환됨.
char c = 'c';
System.out.println((int)c); // 99
System.out.println('c' - 'a'); // 99 - 97 = 2
• c - 'a' → 알파벳 인덱스(0~25)로 변환
• + n → n만큼 밀기
• % 26 → 알파벳 순환
• + 'a' → 다시 문자 코드로 복원
• (char) → int → 문자 변환
자바는 char를 산술 연산 시 자동으로 int로 변환하기 때문에, 별도 캐스팅 없이도 연산이 가능하다.
'개발 공부 > 알고리즘' 카테고리의 다른 글
| [Java] 완전탐색 4가지 케이스 (백준 N과 M) (0) | 2025.08.27 |
|---|---|
| [Java] 프로그래머스 - 게임 맵 최단거리 (BFS - 큐) (2) | 2025.08.22 |
| [Java] 프로그래머스 - 소수 찾기 (백트래킹) (0) | 2025.08.21 |
| 최소 신장 트리 (MST) - 크루스칼/프림 알고리즘 (ft.백준 1197) (5) | 2025.03.31 |
| [Python] 백준 9935 문자열 폭발 문제 (스택, 문자열 메서드 join) (0) | 2025.03.27 |