[BOJ] 1946 신입사원

그리디


해당 문제를 그리디 유형으로 접근 한 정당성은 다음과 같다.

  • 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발 → 정렬을 통해 접근할 수 있겠다 → 한 종목에 대해 정렬을 한 후 완전탐색하여 순간의 최소 순위를 통해 고를 수 있겠다

시간복잡도

  • test case T가 최대 20, input의 사이즈가 최대 10만 → 10만의 N^2은 100억이다. 시간초과가 날 수밖에 없음
  • 따라서 NlogN의 알고리즘까지 사용할 수 있겠다. → Python의 sort 메서드는 NlogN을 지원하므로 이를 이용해서 구현해보자

위와 같은 생각을 통해 구현한 코드는 아래와 같다.

import sys

def solution(ranks, n):
    answer = 1
    # 한 종목을 오름차순으로 정렬
    ranks.sort(key=lambda x: x[0])  # O(NlogN)
    rank_min = ranks[0][1]
    # 나머지 한 종목을 순회하며 검사 O(N)
    for rank in ranks:
        if rank[1] < rank_min:
            rank_min = rank[1]
            answer += 1
    return answer

if __name__ == "__main__":
    T = int(sys.stdin.readline().rstrip())
    # solution 제외 O(TN) -> 약 200만
    # solution O(NlogN) -> 약 50만
    # 도합 O(TNlogN) -> 약 1000만
    # 제한시간이 2초 이므로 약 2000만번의 수행 이내에 끝내야 한다.
    for _ in range(T):
        test_ranks = list()
        N = int(sys.stdin.readline().rstrip())
        for _ in range(N):
            doc, interview = map(int, sys.stdin.readline().rstrip().split())
            test_ranks.append([doc, interview])

        print(solution(test_ranks, N))

태그:

카테고리:

업데이트: