PCCP/프로그래머스

[프로그래머스 JAVA] 시저 암호

Life Log 2025. 5. 3. 23:36
728x90
반응형

문제 링크 👉 https://school.programmers.co.kr/learn/courses/30/lessons/12926


🔑 1. 문제 핵심 요약

주어진 문자열 s의 각 알파벳 문자를 n만큼 밀어 암호화하는 문제입니다.
대소문자는 따로 순환 처리해야 하고, 공백은 그대로 둬야 합니다.


⚠️ 2. 주의사항

  • 공백 ' '은 변하지 않습니다.
  • 대문자 ↔ 대문자, 소문자 ↔ 소문자 → 따로 처리.
  • 밀었을 때 'z'를 넘으면 'a', 'Z'를 넘으면 'A'로 돌아가야 함.
  • Character 클래스 사용 → isUpperCase, isLowerCase로 깔끔한 분기 가능.

🛠️ 3. 슈도코드

for 각 문자 c in 문자열:
    if c == ' ':
        그대로 추가
    else if c는 대문자:
        'A' ~ 'Z' 범위에서 n만큼 밀고 순환
    else if c는 소문자:
        'a' ~ 'z' 범위에서 n만큼 밀고 순환
문자열 합쳐서 반환

💻 4. Character 클래스 사용 코드

class Solution {
    public String solution(String s, int n) {
        StringBuilder sb = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (c == ' ') {
                // 공백은 그대로
                sb.append(c);
            } else if (Character.isUpperCase(c)) {
                // 대문자 처리
                char shifted = (char) (c + n);
                if (shifted > 'Z') {
                    shifted = (char) (shifted - 'Z' + 'A' - 1);
                }
                sb.append(shifted);
            } else if (Character.isLowerCase(c)) {
                // 소문자 처리
                char shifted = (char) (c + n);
                if (shifted > 'z') {
                    shifted = (char) (shifted - 'z' + 'a' - 1);
                }
                sb.append(shifted);
            }
        }

        return sb.toString();
    }
}

✅ 코드 핵심 설명

  • Character.isUpperCase(c) → 대문자 여부 확인
  • Character.isLowerCase(c) → 소문자 여부 확인
  • 밀었을 때 'Z', 'z' 초과 여부 if로 체크, 초과하면 앞쪽으로 순환
  • StringBuilder로 문자열 합치기 → 성능 최적화

📣 마무리

Character 클래스는 자바에서 문자 분류 및 체크 작업을 훨씬 간단하게 만들어줍니다.
앞으로 문자열 문제 풀 때 적극적으로 활용해보세요!

728x90
반응형