[BOJ][⚪2][백준#01931] 회의실 배정

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #1931


문제

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


입력

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


출력

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


예제

입력

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


출력

4


My Sol

import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)

def foo(s, e, d, cnt):
    if d == N:
        global maxCnt
        maxCnt = max(maxCnt, cnt)
        return

    if Ms[d][0] >= e:
        foo(Ms[d][0], Ms[d][1], d+1, cnt+1)
    else:
        foo(s, e, d+1, cnt)

N = int(input())
Ms = []
for _ in range(N):
    s, e = map(int, input().split())
    Ms.append((s, e))
Ms.sort(key=lambda x:(x[1], x[0]))
maxCnt = 0
foo(Ms[0][0], Ms[0][1], 1, 1)
print(maxCnt)

회의 종료 시간을 기준으로 회의 리스트를 정렬해서 하나씩 비교하면 되겠다. 이와 같은 경우 첫 번째 회의가 가장 빨리 끝나게 되기 때문에 cnt한다. 다음 회의의 시작 시각이 이전 회의의 종료 시각보다 빠르지 않다면 회의가 가능하기 때문에 cnt하고 회의의 종료 시각을 갱신한다.


결과

맞았습니다!!


모범답안

출처

import sys
n = int(sys.stdin.readline())
T = []
cnt = 1
sIdx = 0
for i in range(n):
    T.append(list(map(int, sys.stdin.readline().split())))
T.sort()
T.sort(key= lambda x:x[1])

for i in range(1, n):
    if T[sIdx][1]<=T[i][0]:
        sIdx = i
        cnt+=1
print(cnt)

나는 재귀를 사용하여 recursionLimit을 문제 크기에 맞게 설정해주었는데, for문을 활용해 확인하여 함수 호출시간도 없애 연산 시간을 줄이고 recursionError에서도 피할 수 있는 방법이어서 추가하였다.

댓글남기기