백준 python 기록

백준 파이썬 1931 회의실 배정

작지 2021. 9. 15. 10:30

백준 링크:https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

그리드, 정렬을 이용한 풀이를 했다.

import sys

n=int(input())
li=[list(map(int,sys.stdin.readline().split())) for i in range(n)]
li.sort()
cnt=0
for i in range(n):
    result = 1
    temp = li[i][1]
    for j in range(i+1,n):
        if temp > li[j][0]:
            continue
        else:
            temp += (li[j][1]-li[j][0])
            result += 1
    if cnt < result :
        cnt = result
print(cnt)

이중 for in문을 돌려서 시간복잡도가 미친듯이 돌아간다. 100001 * 50000은 해야하나???

너무끔찍한 풀이였다.

 

그래서 for in문을 하나로 압축하는 방식으로 생각해서

import sys

n=int(input())
li=[list(map(int,sys.stdin.readline().split())) for i in range(n)]
li.sort(key= lambda x: (x[1],x[0]))
a,s=0,0
for i,j in li:
    if a <= i:
        s += 1
        a = j
print(s)

먼저 끝나는 순으로 정렬 한 후

만약 x[1]이 x+1[0] 보다 작다면 카운터를 올리고 x+1[1]로 반복

설명이 더 어렵네..