Queue.peek

Queue의 front(앞) 원소를 제거하지 않고 조회합니다. 같은 역할의 메서드로 element가 있으며, 빈 큐에서 동작이 다릅니다.

시그니처

E peek()       // 빈 큐면 null 반환
E element()    // 빈 큐면 NoSuchElementException
메서드성공실패 (큐가 빔)
peek()front 원소 반환null 반환
element()front 원소 반환NoSuchElementException

큐 상태를 변경하지 않음. 다음에 poll로 꺼낼 원소를 미리 확인할 때 사용.

동작 추적

Queue<Integer> q = new LinkedList<>();
q.add(10); q.add(20); q.add(30);
[ 초기 상태 ]
q: front → [10, 20, 30] ← rear
int x = q.peek();   // 10 반환
[ 변경 후 ]
q: front → [10, 20, 30] ← rear   ← 변화 없음!
x = 10

→ poll과 달리 큐는 그대로 유지됨
q.poll();              // 10 제거
int y = q.peek();      // 20 (새로운 front)

peek vs poll

Queue<Integer> q = new LinkedList<>();
q.add(1); q.add(2);

q.peek();   // 1 — q: [1, 2]   (그대로)
q.poll();   // 1 — q: [2]      (제거됨)
q.peek();   // 2 — q: [2]      (그대로)
동작peekpoll
반환값front 원소front 원소
큐 변경X 변경 안 함O 제거함
빈 큐nullnull

자주 쓰는 패턴

조건부 처리 — 다음 원소 미리 보기

while (!q.isEmpty() && q.peek() <= threshold) {
    q.poll();
    cnt++;
}

peek으로 조건 검사 → 만족하면 poll로 실제 제거. peek 없이 poll만 쓰면 꺼낸 원소를 다시 넣어야 해서 비효율.

그룹 묶기 (기능개발 패턴)

while (!q.isEmpty()) {
    int now = q.poll();
    int cnt = 1;

    while (!q.isEmpty() && q.peek() <= now) {   // peek으로 미리 보기
        q.poll();                                // 조건 맞으면 제거
        cnt++;
    }
    list.add(cnt);
}
[ peek의 역할 ]
"다음 원소가 now 이하면 같은 그룹" 판정을 위해
q.peek()으로 꺼내지 않고 값만 확인 → 조건 만족하면 q.poll()로 제거

만약 peek 없이 짠다면:
  int next = q.poll();     ← 일단 꺼냄
  if (next > now) {
      q.add(next);         ← 다시 넣어야 함 (FIFO 순서 깨짐!)
  }
→ peek이 있으면 이런 복원 필요 없음

BFS 디버깅

while (!queue.isEmpty()) {
    System.out.println("다음 처리할 노드: " + queue.peek());
    int cur = queue.poll();
    // ...
}

우선순위 큐의 최솟값 확인

PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(30); pq.offer(10); pq.offer(20);

pq.peek();   // 10 (최솟값) — 큐는 그대로
pq.poll();   // 10 (최솟값 제거)

PriorityQueue의 peek은 항상 우선순위 최상위 원소.

NullPointerException 주의

Queue<Integer> q = new LinkedList<>();

// 빈 큐에서 peek → null
int x = q.peek();        // X NullPointerException

Integer x = q.peek();    // O
if (x != null) { ... }

// 또는 isEmpty 먼저 체크
if (!q.isEmpty()) {
    int x = q.peek();    // O 안전
}

형제 메서드 정리

용도예외 던짐null 반환
삽입add(e)offer(e)
제거remove()poll()
조회element()peek()

시간복잡도

구현체peek / element
LinkedListO(1)
ArrayDequeO(1)
PriorityQueueO(1) — 힙 루트 조회
ArrayBlockingQueueO(1)

핵심 정리

peek은 큐의 front 원소를 꺼내지 않고 들여다보는 비파괴적 조회로, "다음 원소가 조건에 맞을 때만 제거" 같은 패턴에서 필수입니다. element와 달리 빈 큐에서 null을 반환해 안전하며, PriorityQueue에서는 항상 우선순위 최상위 원소를 보여줍니다. 코딩테스트에서 그룹 묶기, 조건부 dequeue 패턴의 핵심 도구입니다.

CSLOG에서 보기