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.