알고리즘/SWEA

[SWEA] 5202 . 화물 도크

빙빙 2021. 4. 15. 16:32

많이 배정하거나 선택하는 문제를 '활동 선택 문제(Activity Selection problem)'라고 한다.

이 문제가 그리디 알고리즘(탐욕알고리즘)의 전형적인 문제라고 한다.

 

수식으로 그려봤을 때 겹치는 것들을 선택하면 안되는 문제이기 때문에

1. 종료되는 시간을 기준으로 정렬을 했다. sort()함수의 인자 안에 람다를 써주고 기준을 넣어주면 된다.( 리스트의 1번째가 종료시간이므로 x[1]이라고 해줬다.)

2. 다음 순서의 시작이 앞에 것의 종료시간 안에 있다면 그것을 제외시킨다.(pop(0)으로 표현)

3. 겹치지 않는다면 cnt ++해주고 end를 갱신시켜준다.

 

#cnt =1로 초기화한 이유는 제일 빨리 끝나는 것을 선택하고 시작하기 때문


T = int(input())

for tc in range(1,T+1):
    N = int(input())
    dock = [list(map(int, input().split())) for _ in range(N)]
    #끝나는 시간을 기준으로 정렬
    dock.sort(key=lambda x : x[1])
    
    cnt = 1
    end = dock.pop(0) #맨 처음꺼 뽑음

    #다음 시작이 앞의 끝나는 시간안에 있으면 삭제
    while dock:

        if dock[0][0] < end[1]:
            dock.pop(0)

        else:
            cnt +=1
            end = dock.pop(0) #갱신




    print("#{} {}".format(tc,cnt))