개발/알고리즘
LeetCode 917. Reverse Only Letters
나무개발자
2025. 4. 9. 16:33
반응형
📘 LeetCode 917. Reverse Only Letters
📝 문제 설명
주어진 문자열 s
에서 영문자(letter)만 뒤집고,
숫자, 기호 등의 비영문자는 원래 위치를 그대로 유지한 문자열을 반환하라.
🔹 예시
Input:
s = "a-bC-dEf-ghIj"
Output:
"j-Ih-gfE-dCba"
🔸 추가 예시
Input:
s = "Test1ng-Leet=code-Q!"
Output:
"Qedo1ct-eeLg=ntse-T!"
💡 해설
이 문제는 투 포인터 알고리즘의 전형적인 응용이다.
- 양쪽 끝에서 시작하는 포인터(
left
,right
)를 활용하여, - 양쪽에서 영문자만 만나면 교체하고,
- 영문자가 아닌 문자는 그대로 두고 포인터만 이동한다.
이 방식은 문자열을 한 번만 스캔하므로 시간 복잡도는 O(n) 이다.
🚀 해결 전략
- 문자열을 문자 배열(char[])로 변환한다.
- 왼쪽 포인터(
left
)는 앞에서, 오른쪽 포인터(right
)는 뒤에서 시작한다. - 두 문자가 모두 영문자면 교환 → 포인터 모두 이동
- 둘 중 하나라도 영문자가 아니면 해당 포인터만 이동
- 최종적으로 배열을 문자열로 변환하여 반환
💻 Java 코드
class Solution {
public String reverseOnlyLetters(String s) {
char[] chars = s.toCharArray();
int left = 0, right = s.length() - 1;
while (left < right) {
if (!Character.isLetter(chars[left])) {
left++;
} else if (!Character.isLetter(chars[right])) {
right--;
} else {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
return new String(chars);
}
}
✅ 포인트 정리
- Character.isLetter() → 영문자인지 확인할 때 자주 쓰는 유틸
- 문자열 직접 수정이 불가능하므로 char[]로 변환해서 조작
- 투 포인터는 정렬된 배열이나 양 끝에서 조건 비교할 때 매우 유용한 패턴
반응형