❌풀이 1
class Solution {
public String solution(String s, int n) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isAlphabetic(c)) {
if (Character.isLowerCase(c)) {
sb.append((c + n) % 'a');
} else {
sb.append((c + n) % 'A');
}
} else {
sb.append(c);
}
}
return sb.toString();
}
}
💡풀이 2
class Solution {
public String solution(String s, int n) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isLetter(c)) {
// 소문자면 'a', 대문자면 'A'를 기준점으로 설정
char base = Character.isLowerCase(c) ? 'a' : 'A';
// 문자를 n만큼 이동시키되, 알파벳 끝에서 처음으로 순환
char answer = (char) ((c - base + n) % 26 + base);
sb.append(answer);
continue;
}
// 알파벳이 아닌 문자(공백, 특수문자)는 그대로 추가
sb.append(c);
}
return sb.toString();
}
}
📖새로 배운 부분
(char) ((c - base + n) % 26 + base) 로직을 단계별로 분석해보겠습니다.
1단계: c - base
문자를 0부터 25까지의 숫자로 변환합니다.
- 소문자의 경우 base = 'a'이므로 'a' - 'a' = 0, 'b' - 'a' = 1, ..., 'z' - 'a' = 25
- 대문자의 경우 base = 'A'이므로 'A' - 'A' = 0, 'B' - 'A' = 1, ..., 'Z' - 'A' = 25
2단계: + n
변환된 숫자에 이동할 거리 n을 더합니다.
- 예: 'a'(0번째)에서 n=3만큼 이동하면 0 + 3 = 3
3단계: % 26
알파벳은 26개이므로 26으로 나눈 나머지를 구해 순환 처리합니다.
- 예: 'z'(25번째)에서 n=3만큼 이동하면 (25 + 3) % 26 = 28 % 26 = 2
- 이는 'c'에 해당하므로 z → a → b → c로 순환됩니다.
4단계: + base
다시 원래 문자 체계로 변환합니다.
- 소문자: 2 + 'a' = 'c'
- 대문자: 2 + 'A' = 'C'
5단계: (char)
정수 연산 결과를 char 타입으로 형변환합니다.
예시:
- 'x'를 3만큼 이동: ('x' - 'a' + 3) % 26 + 'a' = (23 + 3) % 26 + 'a' = 0 + 'a' = 'a'
- 'Y'를 5만큼 이동: ('Y' - 'A' + 5) % 26 + 'A' = (24 + 5) % 26 + 'A' = 3 + 'A' = 'D'
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 푸드 파이트 대회 (0) | 2025.07.15 |
---|---|
[프로그래머스, Java] 두 개 뽑아서 더하기 (0) | 2025.07.15 |
[프로그래머스, Java] 가장 가까운 같은 글자 (0) | 2025.07.15 |
[프로그래머스, Java] 최소직사각형 (0) | 2025.07.13 |
[프로그래머스, Java] 이상한 문자 만들기 (1) | 2025.07.13 |