시저 암호 문제 풀이 (Java)

문제 설명

문자열 s와 정수 n이 주어질 때, 각 알파벳을 n만큼 밀어서 만든 시저 암호 문자열을 반환하는 문제
예를 들어:

  • "AB"를 1만큼 밀면 "BC"
  • "z"를 1만큼 밀면 "a"

풀이 아이디어

  1. 문자열을 한 글자씩 확인한다.
  2. 알파벳이면 n만큼 민다.
    • 대문자 'A' ~ 'Z' → 65 ~ 90
    • 소문자 'a' ~ 'z' → 97 ~ 122
  3. 범위를 벗어나면 % 26을 이용해 순환 처리한다.
  4. 공백 ' '은 그대로 둔다.

코드

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로 변환하기 때문에, 별도 캐스팅 없이도 연산이 가능하다.

 

+ Recent posts