[백준 1931]회의실 배정

정예인·2022년 9월 4일
0

python

목록 보기
1/5

문제

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

입력

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

출력

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

풀이

회의실을 배정할 때, 리스트의 가장 앞 값을 정렬해주어 작은 값부터 for문으로 돌리는게 효율적 따라서 sort로 정렬해준다. 후 가장 작은 값부터 끝나는 시간이 다음 시작시간보다 작다면 min_time 변수를 다음 값으로 바꿔준 후 카운트 값을 올려준다. 만약 받는 arr의 값이 min_time 의 값보다 시작시간이 크거나 같지만 끝나는 시간이 작다면 min_time 값을 해당 값으로 바꿔주고 다시 for문을 진행한다.

#회의실배정
N = int(input())
arr = [list(map(int,input().split())) for _ in range(N)]
arr=sorted(arr)                 #회의실 값 앞에서부터 정렬
min_time = arr[0]
cnt = 1
for i in range(1,N):            # 시작시간 <= 끝나는시간일 시 , min_time 교체
    if min_time[1] <= arr[i][0]:
        min_time = arr[i]
        cnt += 1
    elif min_time[0]<=arr[i][0] and min_time[1]>=arr[i][1]:     # 1의시작시간<=2의시작시간, 1의끝나는시간>=2의끝나는시간
        min_time = arr[i]
print(cnt)

후기

처음 이중 for문을 사용해서 시간초과가 났다. 그리디형 문제의 경우 효율적 코드에 대한 고민을 해봐야 할듯

profile
hello velog :)

0개의 댓글