Post

Deque에서 pop()을 호출하면 어떤 값이 나올까?

백준에서 단계별 문제 풀기를 통해 Deque를 써보다가 이상한 점을 감지했다.
Deque가 원하는 대로 요소를 꺼내지 않았는 문제였다.

1
2
3
4
5
private static void rotate(int count, Deque<Integer> deque) {
    for (int i = 0; i < count; i++) {
        deque.addFirst(deque.pop());
    }
}

내가 생각한 대로라면 위 메서드 실행 시 맨 뒤(가장 나중에 추가)의 값이 앞으로 올 것이라고 예상했다. 즉, [1, 2, 3, 4, 5] 순서로 Deque에 저장되어 있을 때, [4, 5, 1, 2, 3]을 기대했다.

하지만 출력 결과는 [1, 2, 3, 4, 5]였다. 즉, 1을 빼고 다시 원 위치에 넣고를 반복한 것이다.

확인을 위해 pop() 메서드를 확인해보니, removeFirst()를 호출하고 있었다.

removeFirst()는 가장 먼저 넣은 요소를 꺼내고 제거한다.

Stack에서와 같이 맨 마지막에 저장한 요소를 꺼낼 것이라고 생각한 것과 다르게
맨 처음 저장한 요소를 꺼내고 있었던 것이다.

ArrayDeque에서는 addFirst, addLast, removeFirst, removeLast를 지원하기 때문에
직관적으로 해당 메서드를 호출하는 것이 좋아보인다.

어차피 pop()을 호출해도 removeFirst()를 호출한다.

결과

(pop() == poll() == pollFirst()) != pollLast()

결과적으로 코드를 수정한다면 아래와 같이 바꿀 수 있다.

1
2
3
4
5
private static void rotate(int count, Deque<Integer> deque) {
    for (int i = 0; i < count; i++) {
        deque.addFirst(deque.removeLast());
    }
}

직관적으로 빼고 추가할 수 있다는 점에서 add와 remove를 사용하여 Deque 요소를 관리하자.

This post is licensed under CC BY 4.0 by the author.