문제 분석

게이트 크기의 배열을 선언하고 배열에 현재수보다 큰수만 담아준다 

2번 케이스를 예로 들어보자

4 1 3 2 5 6 8 9 7 10

-----------------

배열[0] - 4

배열[1]

배열[2]

-----------------

배열[0] - 4

배열[1] - 1

배열[2]

-----------------

배열[0] - 4

배열[1] - 1 3

배열[2]

-----------------

배열[0] - 4

배열[1] - 1 3

배열[2] - 2

-----------------

배열[0] - 4 5

배열[1] - 1 3

배열[2] - 2

-----------------

배열[0] - 4 5 6

배열[1] - 1 3

배열[2] - 2

-----------------

배열[0] - 4 5 6 8

배열[1] - 1 3

배열[2] - 2

-----------------

배열[0] - 4 5 6 8 9

배열[1] - 1 3

배열[2] - 2

-----------------

배열[0] - 4 5 6 8 9

배열[1] - 1 3 7

배열[2] - 2

-----------------

배열[0] - 4 5 6 8 9 10

배열[1] - 1 3 7

배열[2] - 2

-----------------

 

배열에 넣을 곳이 없다면 NO 를 출력하고 끝낸다.

 

전체 소스

package test;

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int repeat = Integer.parseInt(st.nextToken());
		int gate = Integer.parseInt(st.nextToken());
		int[] array = new int[gate];

		st = new StringTokenizer(br.readLine(), " ");

		boolean check=false;
		for (int i = 0; i < repeat; i++) {
			int input = Integer.parseInt(st.nextToken());
			check = false;

			for (int j = 0; j < gate; j++) {
				if (array[j] < input) {
					array[j] = input;
					check = true;
					break;
				}
			}

			if (!check) {
				System.out.println("NO");
				break;
			}

		}
		if (check) {
			System.out.println("YES");
		}
	}

}

 

 

 

 

틀린 사례

처음 접근은 큐에 담은 후 현재수와 비교하는 방식으로 했다.

활용할 수 있는 게이트수를 계속 변경했다.

1. 현재와 비교해서 같으면 (꺼낼게 없으면) 넘겼다.

2. 현재와 다르다면 큐의 가장 앞에있는 수를 꺼내서 비교했다.

 

이런식으로 하니 조건이 너무 많이 붙었다.

package test;

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int repeat = Integer.parseInt(st.nextToken());
		int gate = Integer.parseInt(st.nextToken());

		st = new StringTokenizer(br.readLine(), " ");

		PriorityQueue<Integer> q = new PriorityQueue<>();
		int now = 1;
		int max = 0;
		for (int i = 1; i <= repeat; i++) {
			int input = Integer.parseInt(st.nextToken());
			if (now == input) {
				now++;
				while (!q.isEmpty()) {
					int compare = q.poll();
					if (now == compare) {
						now++;
						gate++;
					} else {
						q.offer(compare);
						break;
					}
				}
			} else if (now != input) {
				if (!q.isEmpty()) {
					int compare = q.poll();
					if (now == compare) {
						gate++;
						now++;
					} else {
						q.offer(compare);
						if (max < input) {
							max = input;
							q.offer(input);
						} else {
							q.offer(input);
							gate--;
						}
					}
				} else {
					max = input;
					q.offer(input);
					gate--;
				}

			}
			System.out.println(gate);
			if (gate == 0) {
				System.out.print("NO");
				return;
			}

		}

		System.out.println("YES");
	}

}

 

 

 


문제

그림 G.1: N명의 입국 승객은 k개의 여권 심사 창구 {Qk} 중 하나를 반드시 거쳐야 한다.

N명의 입국 승객이 여권 심사를 위하여 그림 G.1 과 같이 입국 대기 줄에서 [1, 2, … , N − 1, N] 순서로 기다리고 있다. 입국 승객은 준비된 k개의 여권 심사 창구 중 하나를 통과한 뒤 공항을 빠져나갈 수 있다. 입국할 때의 줄 선 승객의 순서를 [1, 2, … , N − 1, N]이라고 할 때 k개의 여권 심사 창구를 통과하여 입국장을 빠져나가는 순서 [π1, π2, … πN−1, πN]는 처음과 달라질 수 있다. k개 여권 심사 창구가 준비되어 있을 때, 이 입국장을 빠져나가는 순서가 가능한 순서인가를 계산해야 한다.

예를 들어 설명해보자. 만일 N = 3, k = 2라고 할 때 입국장을 빠져나가는 순서 중 [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]는 가능하지만 [3, 2, 1]은 불가능하다. 여러분은 입국장을 빠져나가는 순서 [π1, … , πN]가 입력으로 주어질 때, 이 순서가 가능하면 YES 를, 불가능하면 NO 를 출력해야 한다. 단, 특정 큐에 줄을 선 상황에서는 승객들의 순서를 임의로 바꿀 수는 없다. 그리고 각 여권 심사 창구에 준비된 큐는 N명 승객이 모두 들어올 정도로 충분히 크다고 가정한다.

입력

입력은 표준입력을 사용한다. 첫 번째 줄에는 두 개의 정수 N  k 가 주어진다. N은 입국 승객의 수이며 k는 여권 심사 창구의 수이다. 단, 2 ≤ k  N ≤ 100 이다. 그리고 두 번째 줄에는 승객이 입국장을 빠져 나가는 순서 [π1, … , πN]가 주어진다.

출력

출력은 표준출력을 사용한다. 입력으로 주어진 순서 [π1, … , πN]대로 입국장을 빠져나가는 것이 가능하면 YES 를 출력하고, 아니면 NO 를 출력해야 한다.

예제 입력 1 복사

3 2
3 2 1

예제 출력 1 복사

NO

예제 입력 2 복사

10 3
4 1 3 2 5 6 8 9 7 10

예제 출력 2 복사

YES

출처

'알고리즘(BOJ) > Gold' 카테고리의 다른 글

백준 - 단어수학 1339  (0) 2023.03.07
백준 - 콘센트 23843  (0) 2023.03.04
백준 - 토너먼트 만들기 2262  (0) 2023.03.02
백준 - 시간 관리하기 6068  (0) 2023.03.01
백준 - 행복 유치원 13164  (0) 2023.02.28
복사했습니다!