알고리즘(백준)/그리디

[알고리즘/그리디] 1946 번 : 신입 사원 - python

되다 2023. 3. 2. 21:38

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

 


  • 문제
  • 소요시간: 실패


  • 설계하기(접근방법) 

1. 테스트 케이스 입력받기, 지원자 수 입력받기, 지원자 리스트 입력받기

2. 알고리즘 생각하기

먼저 서류를 기준으로 오름차순 정렬한다. 그러면

1 5

2 4

3 2

4 1

5 3 과 같은 형태로 나올 것이다.

알고리즘의 핵심은, "뽑힌 사람은 그 누구보다도 서류성적과 면접성적 모두 모자라서는 안된다이다.

즉 이 정렬된 리스트에선 위에서 아래로 갈수록, 무조건 서류성적은 윗사람보다 낮으니 앞선 사람들의 면접성적보다는 높아야 선발조건에 들어간다는 것이다

첫 사람의 면접 성적을 min값으로 잡고, 그 다음사람이 min값보다 면접성적이 높다면(즉, 숫자가 더 작다면) count +=1을 하고 min값을 다음사람의 값으로 대체해준다.

아니라면 그냥 탈락시키면 된다

3. 결과를 출력한다

 

 

 


  • 코드(출력)
import sys

input = sys.stdin.readline

t = int(input())  # 테스트 케이스

for _ in range(t):
    new = int(input())  # 신입사원 수
    new_list = []  # 신입사원 리스트
    for _ in range(new):
        new_list.append(list(map(int, input().split())))  # 각자의 서류 성적과 면접 성적 입력
    count = 1
    new_list.sort(key=lambda x: x[0])  # 서류 성적 순위로 정렬
    min_grade = new_list[0][1]  # 4 면접 성적 최소 기준
    for i in range(len(new_list)):
        if min_grade > new_list[i][1]:  # 현재 면접최소성적보다 x높은성적(작은 숫자)가 나온다면
            min_grade = new_list[i][1]
            count += 1
    print(count)

  • 얻어갈 부분

1. 그리디 알고리즘을 판단할 때 알고리즘을 잘못 판단하면 어떤 심각한 반례가 생기는지 알게되었다

2. 알고리즘을 떠올릴때 논리적 공백이 없는지 반례를 조금 더 생각해보자

3. key lambda 메서드에 대해서 익숙해졌다.