💡풀이
/**
* 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 |