백준 알고리즘

[python] 백준 19621. 회의실 배정 2

민121 2025. 1. 8. 15:23

문제

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

서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작 시간은 끝나는 시간보다 항상 작다. N개의 회의를 회의실에 효율적으로 배정할 경우 회의를 진행할 수 있는 최대 인원을 구하자.

입력

첫째 줄에 회의의 수 N이 주어진다. 둘째 줄부터 N + 1 줄까지 공백을 사이에 두고 회의의 시작시간, 끝나는 시간, 회의 인원이 주어진다.

출력

첫째 줄에 회의실에서 회의를 진행할 수 있는 최대 인원을 출력한다.

제한

  • 1 ≤ N ≤ 25
  • 임의의 회의 K(1≤ K ≤ N)는 회의 K − 1과 회의 K + 1과는 회의 시간이 겹치고 다른 회의들과는 회의 시간이 겹치지 않는다.
  • 모든 회의의 시작 시간과 끝나는 시간은 231 − 1보다 작거나 같은 자연수 또는 0이다.
  • 모든 회의의 시작 시간과 끝나는 시간은 서로 다르다.
  • 회의 인원은 1,000보다 작거나 같은 자연수 이다.

풀이

이 문제는 제한 조건을 확실히 보고 들어가야하는 문제였다. 제한 조건을 확인하지 않으면... 그렇게 어려운 문제일 수 없다. 문제를 이해해보면, 끝나는 시간과 다음 시작 시간이 겹치면 안되는데, 인원이 각각 주어지니... 가장 많은 인원이 회의실을 사용할 수 있게 한다면 최대 인원은 몇이냐? 라는 내용이었다.

 

처음에 딱 보고, 그럼... 시작 시간과 끝나는 시간을 비교하고... 인원이 더 많은 경우의 수도 계산을 해야하는 건가!? 어떻게 하는 거지... 어려워ㅜㅜㅜ 했었는데...

 

제한사항에 떡하니.

  • 임의의 회의 K(1≤ K ≤ N)는 회의 K − 1과 회의 K + 1과는 회의 시간이 겹치고 다른 회의들과는 회의 시간이 겹치지 않는다.

라고 적혀있는거다. 이게 무슨 뜻이냐. k-1 인원만 택하거나 혹은 k-2 인원에 그 이전 인원 값들을 더한 값을 택하거나. 둘 중 큰 값을 고르면 되는 문제였기에 단순하게 dp로 해결하면 되는 문제였다.

즉, 시작시간과 끝나는 시간을 비교할 필요가 애초부터 없었던 것.

import sys
input=sys.stdin.readline

n = int(input().strip())
meeting = []

for _ in range(n):
    a, b, c = map(int, input().rstrip().split())
    meeting.append((a,b,c))

meeting.sort()

dp = [0]*n
dp[0] = meeting[0][2]
for i in range(1, n):
    dp[i] = max(dp[i-1], dp[i-2]+meeting[i][2])

print(dp[n-1])

 

그렇게 해서 짜진 코드가 바로 이것!

위에 말로 설명했듯이... dp[i-1] 혹은 dp[i-2]+meeting[i][2] 를 비교해서 큰 값을 dp[i]에 넣어주고...

print(dp[n-1])를 해서 (n-1인 이유는 dp(0)에서부터 시작했기 때문에...) 답을 구해주면 되는 문제였다.