728x90

문제

 

 

접근 방식

우선 문제를 정리해 보면

꽃이 피는 날과 지는 날이 주어졌을 때

피는 날을 포함한 날부터 꽃이 피기 시작하고

지는 날을 포함하지 않은 날까지 꽃이 피어있는다.

 

정원에 꽃이 하나라도 피어 있는 상태를 유지하기 위해선

이전에 핀 꽃이 지기 전이나 지자 마자

바로 다음 꽃이 피어 있어야 하기 때문에

이전에 심은 꽃들 중 가장 늦게 지는 날보다 

전이거나 지는 당일에 꽃이 피는 경우에만 심을 수 있다.

10
2 15 3 23
4 12 6 5
5 2 5 31
9 14 12 24
6 15 9 3
6 3 6 15
2 28 4 25
6 15 9 27
10 5 12 31
7 14 9 1

 

위와 같은 입력이 주어졌을 때

꽃이 빨리 피는 순서대로, 같은 경우에는 빨리 지는 순서대로

먼저 정렬을 해준다.

2, 15, 3, 23
2, 28, 4, 25
4, 12, 6, 5
5, 2, 5, 31
6, 3, 6, 15
6, 15, 9, 3
6, 15, 9, 27
7, 14, 9, 1
9, 14, 12, 24
10, 5, 12, 31

 

위의 경우에 최소한의 꽃을 심는 경우는

2.28 ~ 4.25 >> 4.12 ~ 6.5 >> 6.3 ~ 6.15 >> 6.15 ~ 9.27 >> 9.14 ~ 12.24로

5번 꽃을 심어서 정원에 꽃이 핀 상태를 유지할 수 있다.

 

우선 3월 1일 이전에 피고 이후에 지는 꽃 중에서

가장 늦게 지는 꽃을 시작점으로 한 후에

이후 나머지 꽃들의 주기를 살펴보면서

이전 꽃이 지기 전이나 직후에 필 수 있고

이전 꽃보다 늦게 지는 경우에 꽃을 심는다.

 

조심해야 할 부분은 꽃이 필 수 있는 경우라도

더 효율적인 경우 하나만을 골라야 하기 때문에

이전까지 핀 꽃들 중 가장 늦게 지는 꽃보다

오래 피는 꽃만 선택해야 한다.

 

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		int n = Integer.parseInt(br.readLine());

		int[][] flowers = new int[n][4];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());

			flowers[i][0] = Integer.parseInt(st.nextToken());
			flowers[i][1] = Integer.parseInt(st.nextToken());
			flowers[i][2] = Integer.parseInt(st.nextToken());
			flowers[i][3] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(flowers, (o1, o2) -> {
			if (o1[0] != o2[0]) {
				return o1[0] - o2[0];
			} else {
				if (o1[1] != o2[1]) {
					return o1[1] - o2[1];
				} else {
					if (o1[2] != o2[2]) {
						return o1[2] - o2[2];
					} else {
						return o1[3] - o2[3];
					}
				}
			}
		});

		int min = 0;
		int psm = 0;
		int psd = 0;
		int pem = 0;
		int ped = 0;

		for (int i = 0; i < n; i++) {
			int sm = flowers[i][0];
			int sd = flowers[i][1];
			int em = flowers[i][2];
			int ed = flowers[i][3];

			if (sm < 3 || (sm == 3 && sd == 1)) {
				if (em < pem || (em == pem && ed <= ped)) continue;
				min = 1;
				psm = sm;
				psd = sd;
				pem = em;
				ped = ed;
				if (end(pem, min))
					return;
				continue;
			}

			if (min == 0) continue;

			if (sm < psm || sm == psm && sd <= psd) {
				if (em < pem || (em == pem && ed <= ped)) continue;
				pem = em;
				ped = ed;
				if (end(pem, min))
					return;
				continue;
			}

			if (sm < pem || (sm == pem && sd <= ped)) {
				min++;
				psm = pem;
				psd = ped;
				pem = em;
				ped = ed;
			}

			if (end(pem, min))
				return;
		}

		System.out.println(0);
	}

	private static boolean end(int pem, int min) {
		if (pem > 11) {
			System.out.println(min);
			return true;
		}
		return false;
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 1744번 : 수 묶기  (0) 2024.01.11
[백준] 2170번 : 선 긋기  (1) 2024.01.11
[백준] 1541번 : 잃어버린 괄호  (0) 2024.01.10
[백준] 11501번 : 주식  (1) 2024.01.10
[백준] 2217번 : 로프  (1) 2023.12.26

+ Recent posts