문제: https://www.acmicpc.net/problem/1931
문제 설명
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용 표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.
정답
import sys
input = sys.stdin.readline
n = int(input())
array = []
for i in range(n):
start, end = map(int, input().split())
array.append((start, end))
array.sort(key=lambda x: (x[1], x[0]))
count = 1
end = array[0][1]
for i in range(1, n):
if array[i][0] >= end:
end = array[i][1]
count += 1
print(count)
풀이
거스름 돈 문제와 함께 그리디 알고리즘의 대표 문제인 회의실 배정 문제입니다. 처음에 이 문제를 풀었을 때는 어떻게 정렬을 해야 최대 값을 구할 수 있을지 막막했는데, 관련 문제를 풀어보고 나니 유사한 문제들은 모두 해결할 수 있게 되었습니다.
이 문제의 해결 방법은 회의가 끝나는 시간을 기준으로 오름차순 정렬하는 것 입니다. 그리고 처음부터 순서대로 겹치지 않게 회의를 진행시키면서 개수를 세면 됩니다.
이 문제의 주의할 점은 회의의 시작 시간과 끝나는 시간이 같을 수도 있다는 조건이므로 이 조건만 조심하면 어렵지 않게 해결할 수 있습니다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 2667번 - 단지번호붙이기 / Python (0) | 2021.09.20 |
---|---|
백준 1920번 - 수 찾기 / Python (0) | 2021.09.17 |
백준 1541번 - 잃어버린 괄호 / Python (0) | 2021.09.16 |
백준 5585번 - 거스름돈 / Python (0) | 2021.09.16 |
백준 10866번 - 덱 / Python (0) | 2021.09.16 |