[백준] 1931번 - 회의실 배정

yerimstar·2021년 6월 23일
0

Greedy Algorithm

목록 보기
2/10

1차 시도

T = int(input()) # 회의의 수
start, end, cnt = 0,0,0
for i in range(T):
    A, B = map(int,input().split())
    if (end <= A):
        start = A
        end = B
        cnt += 1
print(cnt)

T개의 회의를 입력받을 때 순서대로 회의가 시작된다고 생각했다.
T개의 회의는 입력 순서대로 시작되는 것이 아니므로 입력받은 회의들을 먼저 오름차순으로 sorting할 필요가 있음
-> 또한, 만약 (1,10), (2,2), (3,5) 이런 회의들이 있을 때 끝나는 시간 기준으로 sorting을 하지 않을 경우, (1,10)이 먼저 회의를 점령하면 나머지 뒤에 회의들은 진행될 수 없다. 따라서 최대로 많은 회의를 진행해야 함으로 끝나는 시간 기준 sorting작업이 필요하다.

2차 시도

T = int(input()) # 회의의 수
start, end, cnt = 0,0,0
lst = []

for i in range(T): # T개의 회의를 입력받고 회의들을 lst에 저장한다.
    A, B = map(int,input().split())
    lst.append([A,B])

lst.sort(key=lambda x : (x[1],x[0])) # 끝나는 시간을 기준으로 오름차순함 정렬한 뒤, 시작하는 시간으로 오름차순 정렬

for i in range(T):
    if (lst[i][0] == lst[i][1]):
        cnt += 1
    elif (end <= lst[i][0]):
        start = lst[i][0]
        end = lst[i][1]
        cnt += 1

print(cnt)

25%정도에서 틀렸습니다가 나온다.
질문에 있는 반례들로 테스트해봐도 잘 나오는데 어떤 부분이 문제인지 잘 모르겠음

lst.sort(key = lambda x: (x[1],x[0]))
-> (x[1], x[0]) 끝나는 시간 기준으로 먼저 sorting 후, 시작하는 시간 기준으로 sorting한다.

최종 코드

T = int(input()) # 회의의 수
start, end, cnt = 0,0,0
lst = []

for i in range(T): # T개의 회의를 입력받고 회의들을 lst에 저장한다.
    A, B = map(int,input().split())
    lst.append([A,B])

lst.sort(key=lambda x : (x[1],x[0])) # 끝나는 시간을 기준으로 오름차순함 정렬한 뒤, 시작하는 시간으로 오름차순 정렬

for i in range(T):
    if (end <= lst[i][0]):
        end = lst[i][1]
        cnt += 1
print(cnt)

굳이 조건을 더 걸어줄 필요가 없었음...끝나는 시간을 기준으로 오름차순 정렬한 뒤, 시작하는 시간을 기준으로 오름차순 정렬하면 무조건 (4,4)와 같이 시작시간과 끝나는 시간이 같은 회의들은 카운팅이 진행된다.

profile
백엔드 개발자

0개의 댓글