πŸ§‘β€πŸ«λ°±μ€€ 11000 : κ°•μ˜μ‹€ λ°°μ •

긍긍·2025λ…„ 11μ›” 9일

μ•Œκ³ λ¦¬μ¦˜

λͺ©λ‘ 보기
24/31

문제

λ°±μ€€ 11000 : κ°•μ˜μ‹€ λ°°μ •

μˆ˜κ°•μ‹ μ²­μ˜ λ§ˆμŠ€ν„° κΉ€μ’…ν˜œ μ„ μƒλ‹˜μ—κ²Œ μƒˆλ‘œμš΄ κ³Όμ œκ°€ μ£Όμ–΄μ‘Œλ‹€.

κΉ€μ’…ν˜œ μ„ μƒλ‹˜ν•œν…ŒλŠ” Si에 μ‹œμž‘ν•΄μ„œ Ti에 λλ‚˜λŠ” N개의 μˆ˜μ—…μ΄ μ£Όμ–΄μ§€λŠ”λ°, μ΅œμ†Œμ˜ κ°•μ˜μ‹€μ„ μ‚¬μš©ν•΄μ„œ λͺ¨λ“  μˆ˜μ—…μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ•Ό ν•œλ‹€.

참고둜, μˆ˜μ—…μ΄ λλ‚œ 직후에 λ‹€μŒ μˆ˜μ—…μ„ μ‹œμž‘ν•  수 μžˆλ‹€. (즉, Ti ≀ Sj 일 경우 i μˆ˜μ—…κ³Ό j μˆ˜μ—…μ€ 같이 듀을 수 μžˆλ‹€.)

μˆ˜κ°•μ‹ μ²­ λŒ€μΆ©ν•œ 게 찔리면, μ„ μƒλ‹˜μ„ λ„μ™€λ“œλ¦¬μž!

μž…λ ₯

첫 번째 쀄에 N이 μ£Όμ–΄μ§„λ‹€. (1 ≀ N ≀ 200,000)

이후 N개의 쀄에 Si, Tiκ°€ μ£Όμ–΄μ§„λ‹€. (0 ≀ Si < Ti ≀ 10^9)

좜λ ₯

κ°•μ˜μ‹€μ˜ 개수λ₯Ό 좜λ ₯ν•˜λΌ.

예제 μž…λ ₯ 1

3
1 3
2 4
3 5

예제 좜λ ₯ 1

2

문제 풀이

초기 μ ‘κ·Ό

μ²˜μŒμ— λ“  풀이법을은, Ti 만큼의 1차원 배열을 λ§Œλ“€μ–΄μ„œ κ°•μ˜μ‹€μ„ μ°¨μ§€ν•˜λŠ” μ‹œκ°„μ„ 숫자둜 ν‘œν˜„ν• κΉŒ?μ˜€λ‹€.
λ§Œμ•½ 1~3μ‹œ μˆ˜μ—…μ΄λΌλ©΄ 1λ²ˆλ°°μ—΄λΆ€ν„° 3λ²ˆλ°°μ—΄κΉŒμ§€ 1둜 μ±„μš΄ ν›„, λ‹€μŒ κ°•μ˜μ‹œκ°„μ΄ 이전과 겹치면 +1을 ν•΄μ„œ 2둜 μ±„μš°λŠ” 것이닀. 그리고 μ΅œμ’…μ μœΌλ‘œ, 배열에 λ“€μ–΄κ°„ κ°€μž₯ 큰 μˆ«μžκ°€ ν•„μš”ν•œ κ°•μ˜μ‹€ κ°œμˆ˜κ°€ λœλ‹€κ³  μƒκ°ν–ˆλ‹€.

ν•˜μ§€λ§Œ μ˜ˆμƒν–ˆκ² μ§€λ§Œ 이 ν’€μ΄μ˜ λ¬Έμ œμ μ€...
Si와 Ti의 μž…λ ₯κ°’μ˜ λ²”μœ„κ°€ 10^9μ΄λΌλŠ” 것이닀. 10^9 크기λ₯Ό κ°€μ§„ 배열을 λͺ‡ 번 돌면 λ‹Ήμ—°νžˆ μ‹œκ°„, λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ λ°œμƒν•œλ‹€.

풀이 방법

GPTμ—κ²Œ λ¬Όμ–΄λ³΄μ•„μ„œ 찾은 방법은 μš°μ„ μˆœμœ„νλ₯Ό μ΄μš©ν•΄μ„œ 'μ§€κΈˆκ°•μ˜'와 'λ‹€μŒμ— μžˆμ„ κ°•μ˜'λ₯Ό λΉ„κ΅ν•΄μ„œ
μ§€κΈˆ κ°•μ˜μ˜ λλ‚˜λŠ” μ‹œκ°„μ΄ λ‹€μŒμ— μ‹œμž‘ν•˜λŠ” κ°•μ˜μ˜ μ‹œμž‘ν•˜λŠ” μ‹œκ°„λ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μœΌλ©΄
νμ—μ„œ λΉΌκ³  (μƒˆλ‘œμš΄ κ°•μ˜μ‹€μ„ μΆ”κ°€ν•˜μ§€ μ•Šκ³ ), κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 큐에 μ €μž₯(μƒˆλ‘œμš΄ κ°•μ˜μ‹€μ„ μΆ”κ°€)ν•˜λŠ” 것이닀.

이 과정을 거치고 μ΅œμ’…μ μœΌλ‘œ 큐의 크기λ₯Ό κ΅¬ν•˜λ©΄ 그것이 ν•„μš”ν•œ κ°•μ˜μ‹€μ˜ κ°œμˆ˜κ°€ λ˜λŠ” 것이닀.

μ½”λ“œλ‘œ 보기

1. κ°•μ˜ μ‹œκ°„μ„ 담을 2차원 λ°°μ—΄ 생성

κ°•μ˜μ˜ μ‹œμž‘μ‹œκ°„, λλ‚˜λŠ” μ‹œκ°„μ„ 담을 2차원 배열을 μƒμ„±ν•œλ‹€.
N개의 κ°•μ˜μ˜ μ‹œμž‘, 끝 μ‹œμž‘μ„ λ‹΄μœΌλ‹ˆ λ°°μ—΄μ˜ ν¬κΈ°λŠ” μ•„λž˜μ™€ κ°™λ‹€.
lecture[N][2]

		//λ°°μ—΄ μƒμ„±ν•˜κΈ°
		int[][] lectures = new int[N][2];

		for (int i = 0; i < N; i++) {
        	//μž…λ ₯κ°’ λ°›κΈ°
			StringTokenizer st = new StringTokenizer(br.readLine());

			int S = Integer.parseInt(st.nextToken());
			int T = Integer.parseInt(st.nextToken());
			//배열에 μ €μž₯ν•˜κΈ°
			lectures[i][0] = S;
			lectures[i][1] = T;
		}

2. 배열을 μ‹œμž‘ μ‹œκ°„μ΄ λΉ λ₯Έ μˆœμ„œλŒ€λ‘œ μ •λ ¬

'μ§€κΈˆ κ°•μ˜'와 '뒀에 μžˆμ„ κ°•μ˜' 듀을 λΉ„κ΅ν•˜λŠ” 것이기 λ•Œλ¬Έμ— κ°•μ˜ μ‹œκ°„μ΄ λΉ λ₯Έ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•΄μ€€λ‹€.

Arrays.sort(lectures, (a, b) -> a[0] - b[0]);

3. μš°μ„ μˆœμœ„ 큐 생성, μ΄ˆκΈ°κ°’ μ‚½μž…

μƒˆ κ°•μ˜μ‹€μ΄ ν•„μš”ν•œ μˆ˜μ—…μ„ 담을 μš°μ„ μˆœμœ„ 큐λ₯Ό μƒμ„±ν•˜κ³ , μ΄ˆκΈ°κ°’μœΌλ‘œ 첫번째 μˆ˜μ—…μ˜ λλ‚˜λŠ” μ‹œκ°„μ„ λ„£λŠ”λ‹€.

		PriorityQueue<Integer> pq = new PriorityQueue<>();

		pq.offer(lectures[0][1]);

4. 반볡문 돌기

λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ ν˜„μž¬ κ°•μ˜μ˜ λλ‚˜λŠ” μ‹œκ°„κ³Ό λ‹€μŒ κ°•μ˜λ“€μ˜ μ‹œμž‘ μ‹œκ°„μ„ λΉ„κ΅ν•œλ‹€.
λ§Œμ•½, ν˜„μž¬ κ°•μ˜μ˜ μ’…λ£Œμ‹œκ°„μ΄ λ‹€μŒ κ°•μ˜λ“€μ˜ μ‹œκ°„μ‹œκ°„ 보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄
μˆ˜μ—…μ΄ κ²ΉμΉ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 의미이기 λ•Œλ¬Έμ— μƒˆ κ°•μ˜μ‹€μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€.
μ΄λŸ¬ν•œ κ²½μš°μ— νμ—μ„œ λΊ€λ‹€.

λ§Œμ•½ μœ„μ˜ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ μƒˆ κ°•μ˜μ‹€μ΄ ν•„μš”ν•˜λ‹€λŠ” 의미이기 λ•Œλ¬Έμ— 큐에 남겨둔닀.

그리고 λ‹€μŒ κ°•μ˜μ˜ μ’…λ£Œμ‹œκ°„μ„ 큐에 λ„£κ³  λ°˜λ³΅ν•œλ‹€.

		for (int i = 1; i < N; i++ ) {
			//λ‹€μŒ κ°•μ˜μ˜ μ‹œμž‘μ‹œκ°„κ³Ό μ’…λ£Œμ‹œ
			int start = lectures[i][0];
			int end = lectures[i][1];
			
			//ν˜„μž¬ κ°•μ˜μ˜ μ’…λ£Œμ‹œκ°„ <= λ‹€μŒ κ°•μ˜μ˜ μ‹œμž‘
			if (pq.peek() <= start) {
				pq.poll(); //κ²ΉμΉ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νμ—μ„œ 빼버
			}
			//λ‹€μŒκ°•μ˜μ˜ μ’…λ£Œ μ‹œκ°„μ„ λ„£
			pq.add(end);
		}

5. 큐의 크기 κ΅¬ν•˜κΈ°

4번의 κ³Όμ •μ—μ„œ μƒˆ κ°•μ˜μ‹€μ΄ ν•„μš”ν•œ κ²½μš°μ—λ§Œ 큐에 λ‚¨κ²¨λ‘μ—ˆκΈ° λ•Œλ¬Έμ—, μ΅œμ’…μ μΈ 큐의 크기λ₯Ό κ΅¬ν•˜λ©΄ 그것이 ν•„μš”ν•œ κ°•μ˜μ‹€μ˜ κ°œμˆ˜κ°€ λœλ‹€

		//큐의 크기 κ΅¬ν•˜κΈ°  
		System.out.println(pq.size());

회고

μš°μ„ μˆœμœ„ 큐λ₯Ό 잘 ν™œμš©ν•˜μž...
κ°„λ‹¨ν•˜κ²Œ μƒκ°ν•΄μ„œ, μ§€κΈˆ κ°•μ˜ λλ‚˜λŠ” μ‹œκ°„ <= λ‹€μŒ κ°•μ˜ μ‹œμž‘ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ‘œμ§μ΄λΌλŠ” 것을 κΈ°μ–΅ν•˜μž

0개의 λŒ“κΈ€