-
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[]로 변환해서 조작
- 투 포인터는 정렬된 배열이나 양 끝에서 조건 비교할 때 매우 유용한 패턴
반응형'개발 > 알고리즘' 카테고리의 다른 글
LeetCode 2540. Minimum Common Value (0) 2025.04.09 LeetCode 557. Reverse Words in a String III (0) 2025.04.09 위상정렬 (Topological Sort) 완벽 정리 (0) 2025.04.02 백준 2565번 - 전깃줄 (LIS / DP / 이분 탐색) 파이썬 (0) 2025.03.28 백준 9655번 - 돌 게임 파이썬 (0) 2025.03.28 - 양쪽 끝에서 시작하는 포인터(