본문 바로가기
Python

[백준] 1931번 : 회의실 배정

by Leunco 2022. 2. 9.
유형 : 정렬, 그리디

1. 문제

 

예제

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

 

예제 출력

4 # (1,4), (5,7), (8,11), (12,14)

2. 코드

N = int(input())
data = []
for _ in range(N):
    data.append(list(map(int, input().split())))

data.sort(key = lambda x:(x[1],x[0]))

cnt = 1
x = data[0][1] # 끝
for i in range(1,N): # 첫 번째 회의를 두 번째 회의 일정부터 비교
    if x <= data[i][0]: # 시작(data[i][0])과 끝을 비교
        cnt += 1        # 다음 시작이 끝보다 크거나 같으면 다음 회의로 넘어갈 수 있음
        x = data[i][1] # 끝

print(cnt)

 

여기서 핵심은 정렬이다. (x,y)라고 했을 때 y를 기준으로 정렬한 뒤 x를 기준으로 정렬을 한다.(둘 다 오름차순으로) 현재 위치에서 끝값과 그 다음 회의의 처음 값을 비교하는데, 정렬을 통해 둘의 차이가 작으면서 회의가 많이 진행되도록 할 수 있다. (말이 횡설수설한 것 같다)

⇒ 주어진 시작시간과 끝나는 시간들을 이용해서 가장 많은 회의의 수를 알기 위해서는 빨리 끝나는 회의 순서대로 정렬을 해야 한다. 빨리 끝날수록 뒤에서 고려해볼 회의가 많기 때문이다. 
출처: https://suri78.tistory.com/26 [공부노트]

 

참고로 예시를 정렬했을 경우 아래와 같다.

[[1, 4], [3, 5], [0, 6], [5, 7], [3, 8], [5, 9], [6, 10], [8, 11], [8, 12], [2, 13], [12, 14]]

 

참고 : https://suri78.tistory.com/26

문제 출처 : https://www.acmicpc.net/problem/1931

반응형

'Python' 카테고리의 다른 글

[이취코] 곱하기 혹은 더하기  (0) 2022.02.09
[이취코] 모험가 길드  (0) 2022.02.09
[이취코] 1이 될 때까지  (0) 2022.02.08
[이취코] 숫자 카드 게임  (0) 2022.02.08
[이취코] 큰 수의 법칙  (0) 2022.02.08

댓글