ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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) 이다.


    🚀 해결 전략

    1. 문자열을 문자 배열(char[])로 변환한다.
    2. 왼쪽 포인터(left)는 앞에서, 오른쪽 포인터(right)는 뒤에서 시작한다.
    3. 두 문자가 모두 영문자면 교환 → 포인터 모두 이동
    4. 둘 중 하나라도 영문자가 아니면 해당 포인터만 이동
    5. 최종적으로 배열을 문자열로 변환하여 반환

    💻 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[]로 변환해서 조작
    • 투 포인터는 정렬된 배열이나 양 끝에서 조건 비교할 때 매우 유용한 패턴
    반응형
Designed by Tistory.