공부하기/백준

[Python] 백준 풀기 1946 - 신입 사원

XEV 2022. 11. 22. 21:46

파이썬 백준 1946번

실버1

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

 

 

 

문제 보기

분류: 그리디 알고리즘, 정렬

 

 

 

 

 

문제 풀기

순위를 2차원 리스트로 입력받아 오름차순 정렬을 하고 순차적인 서류 등수 순번대로 면접 등수를 비교하여 우위에 있는 지원자를 찾는다.

조건을 만족할때 hired 를 하나씩 늘려 선발되는 지원자의 수를 출력한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnEmployment(T):
    for _ in range(T):
        ## 지원자 수와 성적 순위를 모두 입력.
        applicant_num = int(inputdata().strip())
        appl_ls = [list(map(int, inputdata().split())) for _ in range(applicant_num)]
        
        ## 면접 순위로 정렬을 먼저하고 서류 순위로 정렬을 하여 저장.
        sorted_rank = sorted(appl_ls, key=lambda x: (x[0], x[1]))
        print(sorted_rank)          # test print
        
        ## 서류 순위 오름차순으로 하나씩 꺼내어 면접 순위가 더 우월한 지원자가 있는지 찾음.
        ## if 문을 만족하면 그 지원자를 다시 기준으로 만들고 hired 카운트를 하나 올림.
        above = 0
        hired = 1
        for i in range(1, len(sorted_rank)):
            if sorted_rank[i][1] < sorted_rank[above][1]:
                above = i
                hired += 1
        print(hired)


if __name__ == "__main__":
    T = int(inputdata().strip())
    
    fnEmployment(T)



# 2
# 5
# 3 2
# 1 4
# 4 1
# 2 3
# 5 5
# 7
# 3 6
# 7 3
# 4 2
# 1 4
# 5 7
# 2 5
# 6 1


# [[1, 4], [2, 3], [3, 2], [4, 1], [5, 5]]
# 4

# [[1, 4], [2, 5], [3, 6], [4, 2], [5, 7], [6, 1], [7, 3]]
# 3