땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • D
  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • I
  • E

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 최소 회의실 개수(우선순위 큐, 그리디)★★

2022. 8. 12. 14:44

https://www.acmicpc.net/problem/19598

 

19598번: 최소 회의실 개수

2개 회의실로 3개 회의를 모두 진행할 수 있다. 예를 들어, 첫번째 회의실에서 첫번째 회의를 진행하고 두번째 회의실에서 두번째 회의와 세번째 회의를 진행하면 된다. 1개 회의실로 3개 회의

www.acmicpc.net

매우 어려운 문제였지만 원리를 이해한다면 쉽다.

 

> 접근방법

우리는 회의실을 가장 적게 쓰고 싶어한다.

주어지는 입력은 무작위로 들어올텐데 문제를 읽어보면

진행되는 회의의 종료시간과 다음 회의 시작시간의 상관관계가 가장 중요하다는 것은 알 수 있다.

즉, 회의 데이터들의 입력을 받고 시작시간 기준으로 정렬해줄 필요가 있다.

why?)

그래야 순차적으로 회의실을 늘릴지말지 판별할 수 있지 않은가?

 

자, 우리는 이제 회의 데이터를 읽어나가면서 지금 진행되는 회의보다 시작시간이 먼저인 회의는 절 때 나오지 않는다(시작시간에 대해 정렬 해줘서)

for(int[] time:meetings) {
    if (pq.peek() > time[0]) //min-heap이 시작시간보다 크면 회의실 추가
        cnt++;
    else
        pq.poll(); //회의실을 이어서 쓸 수 있다는 거니까 이전의 정보 삭제
    pq.add(time[1]);
}

우리는 회의가 진행되는 정보를 어떤 자료구조에 넣어서 관리를 하려고 하는데 이 문제에서 중요한 부분은

진행되는 여러가지 회의들 중 제일 빨리 끝나는 회의시간을 지속적으로 알아야할 필요가 있다

why?)

최소의 회의실을 사용해야하는데 먼저 끝나는 회의실에 대한 정보를 가지고 활용해야한다.

예를 들어 10에 끝나는 회의가 있는데 다음 회의가 10이상인 시간에 시작된다고 하면 회의실을 늘릴 필요가없다. 이러한 판단은 어떻게 할 수 있겠는가?

=> 우선순위큐를 이용하여 값을 넣으면 최소값이 자동으로 정렬되고 가장 빨리 끝나는 시간을 앞에둬서 pq.peek()로 접근 가능하여 활용하기 편리하기 때문에 Priority Queue를 사용한 것

 

package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;


public class Main_19598 {

	public static void main(String[] args) throws  IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int[][] meetings = new int[n][2];
		int cnt = 0;
		PriorityQueue<Integer> pq = new PriorityQueue<>();
		
		for (int i = 0; i < n; i++) {
			String[] input = br.readLine().split(" ");
			for (int j = 0; j < 2; j++) {
				meetings[i][0] = Integer.parseInt(input[0]);
				meetings[i][1] = Integer.parseInt(input[1]);
			}
		}
	
		Arrays.sort(meetings, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[0] - o2[0];
			}
		});
		
		
		pq.add(Integer.MAX_VALUE);
		
		for(int[] time:meetings) {
			if (pq.peek() > time[0]) //min-heap이 시작시간보다 크면 회의실 추가
				cnt++;
			else
				pq.poll(); //회의실을 이어서 쓸 수 있다는 거니까 이전의 정보 삭제
			pq.add(time[1]);
		}
		
		
		
		
		System.out.println(cnt);
		
		
	}

}

 

 

 

 

 

 

 

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 17135 캐슬 디펜스(구현, 조합, BFS) ★★  (0) 2022.08.19
백준 1826 연료 채우기(우선순위 큐, 그리디)★★  (0) 2022.08.12
백준 17406 배열 돌리기4(구현)  (0) 2022.08.12
백준 16206 롤케이크(그리디)  (0) 2022.07.12
백준 1068 트리(DFS)  (0) 2022.07.10
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 17135 캐슬 디펜스(구현, 조합, BFS) ★★
    • 백준 1826 연료 채우기(우선순위 큐, 그리디)★★
    • 백준 17406 배열 돌리기4(구현)
    • 백준 16206 롤케이크(그리디)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바