본문으로 바로가기


백준 1946. 신입사원

 문제는 특정 기준에 충족되는 신입 사원만을 선발하고자 하며
그 기준에 따라 총 몇 명의 신입사원을 채용하게 되는지 알아보려고 한다.

문제에서 제시한 조건

- 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접 시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다.
- 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.
- 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다.

문제 풀이 방법

한 지원자의 성적을 다른 모든 지원자의 성적과 비교할 경우, 반복문을 자주 사용하게 되고 그러면 시간 초과가 날 확률이 높다.
이 문제는 단 한번의 for문을 사용하여 결과를 얻을 수 있다.
그러기 위해서는 성적 (resume, interview) 중에 resume 성적 순으로 먼저 정렬하고,
정렬된 지원자는 본인의 앞에 위치한 지원자들의 interview 성적들 중에 가장 최고 순위(숫자가 가능 낮음)와 비교하여 우수하면 
(즉, 지원자의 순위의 값이 최고 순위의 값보다 낮으면) 채용하기로 한다.
이 문제는 숫자가 순위를 나타내기 때문에 숫자가 적을 수록 우수한 점수를 받은 사람이라는 점을 제대로 인식하지 않으면
코드를 짜면서 헷갈릴 수도 있으니 주의하면서 코드를 짜야한다.

파이썬 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
 
def gen(case_num):
    for i in range(case_num):
        n = int(sys.stdin.readline().strip())
        records = []
        for j in range(n):
            report, interview = map(int, sys.stdin.readline().strip().split())
            records.append((report, interview))
        records = sorted(records, key=lambda record: record[0])
        yield records
 
def greedy(records):
    count = 0
    min_interview_record = 567850687058670507
    for idx, record in enumerate(records):
        if record[1< min_interview_record:
            min_interview_record = record[1]
        if record[0== 1 or record[1== 1:
            count += 1
            continue
 
        if record[1> min_interview_record:
            continue
        count += 1
    return count
 
if __name__ == "__main__":
    case_num = int(sys.stdin.readline().strip())
    for records in gen(case_num):
        print(greedy(records))
cs


#1946 신입사원 python #1946 신입사원 #1946. 신입사원 #백준 신입사원 #백준 신입사원 python #백준 신입사원 문제 #백준 신입 사원 문제 #백준 신입 사원 문제 정답 

#백준 1946 #python 백준 신입사원 #백준 1946. 신입사원 #파이썬 1946 신입사원 #Python으로 푸는 백준 1946. 신입사원