Google 태그 관리자 아이콘

알고리즘 풀이

.leetcode(917. Reverse Only Letters)

silvergoni 2022. 3. 30. 09:22
반응형

https://leetcode.com/problems/reverse-only-letters/

 

1. 2022.03.30 시도

소요시간: 9분

class Solution {
    public String reverseOnlyLetters(String s) {
        int left = 0;
        int right = s.length() -1;
        
        String ls ="";
        String rs ="";
        while(left < right) {
            char lc = s.charAt(left);
            char rc = s.charAt(right);
            if (isEnglishLetter(lc) == false) {
                left++;
                ls = ls + lc;
                continue;
            } else if (isEnglishLetter(rc) == false) {
                right--;
                rs = rc + rs;
                continue;
            }
            
            ls = ls + rc;
            rs = lc + rs;
            
            left++;
            right--;
        }

        if (left == right) {
            return ls + s.charAt(left) + rs;
        }

        return ls+rs;
    }
    
    private boolean isEnglishLetter(char letter) {
        if ('a' <= letter && letter <= 'z') {
            return true;
        }

        if ('A' <= letter && letter <= 'Z') {
            return true;
        }
        
        return false;
    }
}

풀이 접근 과정

양쪽의 글자를 이어서 붙인다는 생각으로 만들었다.

ls는 왼쪽부터 채워지는 글자고, rs는 오른쪽부터 채워지는 글자다.

 

느낀점

  • 솔루션을 보니 이렇게 풀면 훨씬 쉽게 다가오겠다는 것이 있어 소개한다.
  • 첫번째는 스택을 이용하는 방법이 있고
  • 두번째는 포인터를 이용해 더해가는 것이다.
// stack
class Solution {
    public String reverseOnlyLetters(String s) {
        LinkedList<Character> stack = new LinkedList<>();
        
        for (int i=0; i<s.length(); i++) {
            if (Character.isLetter(s.charAt(i))) {
                stack.push(s.charAt(i));
            }
        }
        
        StringBuilder ret = new StringBuilder();
        for (int i=0; i<s.length(); i++) {
            if (Character.isLetter(s.charAt(i))) {
                ret.append(stack.pop());
            } else {
                ret.append(s.charAt(i));
            }
        }
        
        return ret.toString();   
    }
}
// pointer
class Solution {
    public String reverseOnlyLetters(String s) {
        int j = s.length() - 1;
        StringBuilder ret = new StringBuilder();
        for (int i=0; i<s.length(); i++) {
            if (Character.isLetter(s.charAt(i))) {
                while(!Character.isLetter(s.charAt(j))) {
                    j--;
                }
                
                ret.append(s.charAt(j--));
            } else {
                ret.append(s.charAt(i));
            }
        }
        
        return ret.toString();
    }
}

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형