<내 코드>
def recruit(num, score):
min_interview = score[0][1] # 첫번째 지원자 면접 등수
cnt = 1 # 첫 번째 지원자는 서류점수가 1등이기에 무조건 뽑힘
for i in range(1, num): # 1번 ~ n-1번
if score[i][1] < min_interview: # 뽑히는 경우
min_interview = score[i][1] # 더 높은 등수로 변경
cnt += 1
return cnt
tests = int(input())
for _ in range(tests):
num = int(input())
score = [list(map(int, input().split())) for _ in range(num)]
score.sort(key=lambda x: x[0]) # 서류 시험 등수 오름차순
print(recruit(num, score))
Python3로 제출하면 시간 초과가 나고, pypy로 제출하니 통과가 됐다. for문을 최대로 줄이려고 해 봤지만 다른 방법을 찾기가 쉽지 않았다.
문제 조건
- 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발.
- 즉, 현재 지원자의 서류 성적보다 더 높은 서류 성적을 가진 사람들보다 면접 성적이 높아야 선발된다.
따라서 우선 성적을 '서류 성적순'으로 정렬시킨다. 그리고 가장 높은 서류 성적을 가진 사람은 면접이 낮더라도 무조건 선발된다. 그래서 첫 번째 지원자의 면접 성적을 min_interview에 담고 그 값을 다음 사람들과 비교해나간다.
더 낮은(즉, 더 좋은 면접 성적) 성적을 가진 사람이 있으면 min_interview에 담는다. 그렇게 되면 특정 지원자의 면접시험 성적과 min_interview만 비교해 특정 지원자의 선발 여부를 결정할 수 있게 된다. 왜냐하면 이미 서류 성적순으로 정렬이 됐기에 지나온 지원자들보다 면접 성적만 낮지 않으면 되기 때문이다.
반응형
'알고리즘 문제풀기 > 백준 - Python' 카테고리의 다른 글
[백준 2217] 로프 - Python (그리디 알고리즘, 정렬) (0) | 2020.08.28 |
---|---|
[백준 10162] 전자레인지 - Python (그리디 알고리즘) (0) | 2020.08.27 |
[백준 2839] 설탕 배달 - Python (그리디 알고리즘) (0) | 2020.08.27 |
[백준 1931] 회의실 배정 - Python (그리디 알고리즘, 정렬) (0) | 2020.08.26 |
[백준 1541] 잃어버린 괄호 - Python (그리디 알고리즘) (0) | 2020.08.26 |