[백준] 19621번 회의실 배정 2

천호영·2021년 5월 23일
0

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

문제

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


입력

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


출력

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


제한

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

예제 입력 1

6
10 40 80
30 60 60
50 80 70
70 100 100
90 120 40
110 140 50

예제 출력 1

230

1번, 4번, 6번 회의를 진행하는 게 최적이다.


풀이

그리디 대표 문자인 기본 회의실 배정 문제와 다르게, 최대한 많은 수의 회의를 배정하는 것이 아닌, 총 회의인원수를 많게 하는 것이 목적인 문제입니다.

문제의 조건으로부터 정렬된 상태로 회의가 주어지고, 회의의 앞뒤가 항상 겹치므로 백트래킹으로 문제를 해결합니다.

소스코드

import sys
input = sys.stdin.readline #입력빠르게받기

def dfs(cnt, sum): #cnt번째 회의에 대해, cnt-1번째 회의까지 인원수합 sum
  global ans

  if cnt >= meeting_num:
    ans = max(ans,sum)
    return

  dfs(cnt+1, sum) #이 회의 포함 안할 경우
  dfs(cnt+2, sum+arr[cnt][2]) #이 회의 포함할 경우
  

arr=[]
meeting_num = int(input())
for _ in range(meeting_num):
  start,end,peole_num = map(int,input().split())
  arr.append((start,end,peole_num))

ans = 0 #최대 회의 인원수 저장될 변수
dfs(0,0) #0번째 회의에 대해 살피는데, 그 전까지의 인원수합은 0
print(ans)

참고 풀이: https://krockseed.tistory.com/1

0개의 댓글