PS/LeetCode

[LeetCode] Backspace String Compare (JAVA)

제이온 (J.ON) 2021. 11. 10.

문제

Given two strings s and t, return true if they are equal when both are typed into empty text editors. '#' means a backspace character.

Note that after backspacing an empty text, the text will continue empty.

 

입출력 및 제약 사항

 

풀이

스택으로 풀 수 있는 문제였습니다. 각 문자열의 요소를 스택에 집어 넣되, '#'을 만났을 때는 빼 내면 됩니다. 이 문제에서 흥미로운 점은 Stack끼리 equals() 연산이 가능하다는 것입니다. Stack의 equals() 메소드를 살펴 보겠습니다.

 

Stack은 기본적으로 Vector의 상속을 받은 구조이고, Stack은 Vector의 equals()을 상속받습니다.

 

    public synchronized boolean equals(Object o) {
        return super.equals(o);
    }

 

또한, Vector는 AbstractList의 상속 받고 있고, 위 코드에서 볼 수 있듯이 equals() 메소드도 AbstractList로부터 온 것을 재활용하고 있습니다.

 

   public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof List))
            return false;

        ListIterator<E> e1 = listIterator();
        ListIterator<?> e2 = ((List<?>) o).listIterator();
        while (e1.hasNext() && e2.hasNext()) {
            E o1 = e1.next();
            Object o2 = e2.next();
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return !(e1.hasNext() || e2.hasNext());
    }

 

위는 AbstractList의 equals() 메소드인데, Iterator를 사용하여 각 리스트의 요소를 비교하는 것을 알 수 있습니다. 즉, 정리하자면 두 Stack에 대해 equals() 연산을 수행하면, 각 Stack의 요소끼리 다시 equals() 연산으로 비교하고 모두 같다면 true를 반환합니다. 해당 문제는 Stack<Character>를 사용하므로 각 Stack의 문자가 '==' 연산으로 같으면 true입니다.

 

아래는 위 내용을 정리한 소스 코드입니다.

 

소스 코드

class Solution {
    public boolean backspaceCompare(String s, String t) {
        return backspaceString(s).equals(backspaceString(t));
    }
    
    private  Stack<Character> backspaceString(String str) {
        Stack<Character> stack = new Stack<>();
        for (char c : str.toCharArray()) {
            if ('#' != c) {
                stack.push(c);
                continue;
            }
            if (!stack.isEmpty()) {
                stack.pop();
            }
        }
        return stack;
    }
}

'PS > LeetCode' 카테고리의 다른 글

[LeetCode] Backspace String Compare (JAVA)  (0) 2021.11.10
[LeetCode] Reshape the Matrix (JAVA)  (0) 2021.11.08
[LeetCode] Add Binary (JAVA)  (0) 2021.11.02
[LeetCode] Move Zeroes (JAVA)  (0) 2021.10.20
[LeetCode] Squares of a Sorted Array (JAVA)  (0) 2021.10.19
[LeetCode] Rotate Array (JAVA)  (0) 2021.10.19

추천 글