상세 컨텐츠

본문 제목

16466. 콘서트

Algorithm

by aeongiii 2024. 12. 2. 15:43

본문




1. 문제 분석
    1) N개의 티켓 번호가 공백으로 구분하여 주어진다.
    2) 팔리지 않은 티켓 중 가장 작은 번호를 출력한다.

2. 제약 조건
   1 <= 팔린 티켓 수 N <= 1,000,000
   1 <= 팔린 티켓번호 A <= 2,147,483,648 - 1  (int에 딱 들어감)

3. 의사결정
    1) 첫줄에서 N을 입력받고, 둘째 줄에서 팔린 티켓 번호들을 공백으로 구분하여 입력받는다.
    2) 티켓번호는 매우 많을 수 있으므로, 배열에 받은 뒤 정렬하면 비효율적이다. 입력받자마자 최소힙에 넣자.
    3) 모두 넣었다면, 최소힙에서 하나씩 빼면서 번호를 확인한다.
        - 첫번째 뽑은 값이 1이 아니라면 ===> 정답은 1
        - 첫번째 뽑은 값이 1이라면
            - 이미 뽑은 최소값과 다음에 뽑은 최소값을 비교하여 1만큼 차이나는지 확인한다. (이어지는 정수인지)
                - 1만큼 차이난다면 : 그 다음 최소값을 뽑는다.
                - 2 이상 차이난다면 : [이미 뽑은 최소값]의 +1 이 정답이다.

4. 문제 해결
    1) 만약 비어있는 수 없이 1부터 N까지 이어진다면, 가장 작은 수로 N+1을 출력해야 한다.


import java.util.*;
import java.io.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // N 입력

        StringTokenizer st = new StringTokenizer(br.readLine());
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(); // 최소힙 생성

        // N개 모두 최소힙에 넣기
        for (int i = 0; i < N; i++) {
            minHeap.add(Integer.parseInt(st.nextToken()));
        }

        // 최소값 뽑아서 nowTicket에 넣음
        int nowTicket = minHeap.poll();

        // 최소값이 1이 아니라면, 정답은 1이므로 탈출 및 출력
        if (nowTicket != 1) {
            System.out.println(1);
            return; // 메서드 종료
        }

        // 최소값이 1이라면, 그 다음거 뽑아서 차이가 1만큼만 나는지 확인.
        while (!minHeap.isEmpty())  {

            int nextTicket = minHeap.poll();
            if (nextTicket - nowTicket > 1) {
                System.out.println(nowTicket + 1); // 2 이상 차이난다면, nowTicket + 1 만큼이 정답이다.
                break;
            }

            nowTicket = nextTicket;
        }

        if (minHeap.isEmpty()) {
            System.out.println(nowTicket + 1); // 만약 1부터 N까지 모든 수가 존재한다면, n+1을 출력해야 한다.
        }

    }
}

'Algorithm' 카테고리의 다른 글

1863. 스카이라인 쉬운거  (0) 2024.12.03
1524. 세준세비  (1) 2024.12.02
11557. Yangjojang of The Year  (0) 2024.12.02
28114. 팀명 정하기  (0) 2024.12.01
1655. 가운데를 말해요  (0) 2024.11.30

관련글 더보기