[프로그래머스, Java] 둘만의 암호

2025. 7. 18. 19:28·CodingTest/Programmers

💡풀이

/**
 * s를 각 문자를 기준으로 순회한다
 *
 * s.charAt을 index만큼 이동해 나간다
 * 만약 이동할 문자가 z 일경우 a로 간다
 * 만약 이동할 문자가 skip에 포함된다면 횟수를 세지않고 넘어간다
 * 이동 완료된 문자는 저장한다
 *
 * 순회 후 저장된 모든 문자를 문자열로 바꿔 return 한다
 */
class Solution {

    public String solution(String s, String skip, int index) {
        StringBuilder sb = new StringBuilder();

        for(char c : s.toCharArray()) {
            int count = 0;

            while(count < index) {
                c = (char) ('a' + (c - 'a' + 1) % 26);
                if(!skip.contains(String.valueOf(c)))
                    count++;
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

📖새로 배운 부분

 Java 알파벳 순환

Java로 코딩할 때 'z' 다음에 다시 'a'가 오게 만드는 알파벳 순환 로직의 대표적인 두 가지 방법 정리

핵심 원리: char는 숫자다

Java에서 char는 내부적으로 숫자(아스키코드)로 처리됩니다. ('a'=97, 'b'=98, ...)
이 덕분에 문자에 직접 덧셈이나 증가 연산(++)을 할 수 있습니다.


1️⃣조건문으로 간단하게 (1칸 이동 시)

가장 직관적인 방법입니다. 문자를 1만큼 더한 뒤, 그 결과가 'z'를 넘어섰는지 확인하여 'a'로 바꿔줍니다.

// c를 1칸 뒤로 이동, 'z'를 넘으면 'a'로
c = (c + 1 > 'z') ? 'a' : (char) (c + 1);

코드가 매우 직관적이고 이해하기 쉽습니다.

2️⃣나머지 연산자(%)로 효율적으로

여러 칸을 한 번에 이동해야 할 때 사용하는 가장 효율적인 방법입니다.

// c를 n칸 뒤로 이동
char nextChar = (char) ('a' + (c - 'a' + n) % 26);

🚨 잠깐! 그냥 (c + n) % 26 하면 되는거 아닌가?

'a'는 숫자 0이 아닌 97부터 시작합니다.
만약 c - 'a' 과정 없이 (c + n) % 26을 하면, 아스키코드 값(97 ~ 122)에 직접 연산하게 되어 완전히 다른 결과가 나옵니다.

한눈에 보는 방법 비교

구분 방법 1: 조건문 방법 2: 나머지 연산자
코드 예시 c = (c+1 > 'z') ? 'a' : (char)(c+1); c = (char)('a' + (c-'a'+n) % 26);
추천 상황 1칸씩만 이동하는 반복문 내부 n칸을 한 번에 점프해야 하는 경우

 

GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.

프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.

github.com

 

'CodingTest > Programmers' 카테고리의 다른 글

[프로그래머스, Java] 대충 만든 자판  (0) 2025.07.18
[프로그래머스, Java] 문자열 나누기  (0) 2025.07.18
[프로그래머스, Java] 로또의 최고 순위와 최저 순위  (0) 2025.07.18
[프로그래머스, Java][1차] 다트 게임  (0) 2025.07.18
[프로그래머스, Java][PCCE 기출문제] 9번 / 지폐 접기  (0) 2025.07.18
'CodingTest/Programmers' 카테고리의 다른 글
  • [프로그래머스, Java] 대충 만든 자판
  • [프로그래머스, Java] 문자열 나누기
  • [프로그래머스, Java] 로또의 최고 순위와 최저 순위
  • [프로그래머스, Java][1차] 다트 게임
devoks
devoks
꾸준히 작성해보자!
  • devoks
    ok's 개발 블로그
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기 (112)
      • Backend (15)
        • SpringBoot (0)
        • Java (15)
      • Cs (18) N
      • Infra (0)
        • AWS (0)
        • Docker (0)
      • CodingTest (79)
        • Programmers (79)
  • 링크

    • My GitHub
  • 인기 글

  • 태그

    java
    CS
    switch
    StringTokenizer
    codingtest
    json
    effectivejava
    programmers
    BufferedReader
    BufferedWriter
  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[프로그래머스, Java] 둘만의 암호
상단으로

티스토리툴바