Algorithm/Greedy

[Python - Greedy] 1931 회의실 배정

턴태 2022. 9. 2. 16:39

📌 문제

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

📌 입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.

📌 출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

📌 문제 풀이

👨‍🏫 접근

가장 많은 강의를 배정해야 한다. 끝나는 시간보다 이른 시간에 시작하는 강의는 배정할 수 없다. 그렇다면 끝나는 시간에 따라서 강의 배정이 정해지기 때문에 매우 중요하다. 정렬을 통해서 끝나는 시간을 먼저 정렬하고, 시작 시간을 그 다음에 정렬해야 한다.

👨‍🏫 문제 풀이

📄 전체 코드

import sys
input = sys.stdin.readline

n = int(input())

rooms = [list(map(int, input().split())) for _ in range(n)]
rooms.sort(key=lambda x: (x[1], x[0]))

cnt = 0
k = 0

for i in range(n):
    if rooms[i][0] < k:
        continue
    else:
        k = rooms[i][1]
        cnt += 1

print(cnt)

📄 준비

import sys
input = sys.stdin.readline

n = int(input())

rooms = [list(map(int, input().split())) for _ in range(n)]
rooms.sort(key=lambda x: (x[1], x[0]))

cnt = 0
k = 0

입력이 많아서 sys 모듈을 사용한다.

 

회의실 배정에서 정렬 기준을 두 개 사용한다. 끝나는 시간을 먼저, 시작 시간을 그 다음으로 해서 정렬해준다. cnt는 회의 개수, k는 시작할 수 있는 시간이다. 매번 시작 시간이 바뀌므로 k라고 저장했다.

📄 풀이

for i in range(n):
    if rooms[i][0] < k:
        continue
    else:
        k = rooms[i][1]
        cnt += 1

print(cnt)

만약 끝나는 시간이 시작시간보다 크다면 시작할 수 없는 것이므로 continue해준다. 만약 같거나 작다면, 그 회의의 끝나는 시간이 저장해주고 cnt를 1 늘린다.

📌 총평

그리디 연습 문제