알고리즘 문제 풀이

77. Python 백준 1946 번 신입 사원 자세한 설명

코딩하는 덕구 🐶 2023. 1. 11. 17:57
728x90
반응형

안녕하세요 코딩하는 덕구입니다.

그리디 알고리즘 문제인 1946 번 신입 사원 파이썬 자세한 설명입니다.

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

 

1946번: 신입 사원

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

www.acmicpc.net

 

 

먼저 백준 1946 번 파이썬 정답 코드입니다.

import sys
input = sys.stdin.readline

T = int(input())
for _ in range(T): #T번 반복
    cnt = 1
    n = int(input())
    grade = [0 for _ in range(n+1)]

    for _ in range(1, n+1):
        a, b = map(int, input().split())
        grade[a] = b

    Min = grade[1]

    for i in range(2, n+1):
        if grade[i] < Min:
            Min = grade[i]
            cnt += 1
    print(cnt)

 

 

서류 점수, 면접 점수 둘 중 하나만 남들보다 높다면 입사시키면 되므로

면접과 서류 점수를 모두 비교하여 남들보다 높은게 하나라도 있을 때 입사자 수를 1개씩 증가시키면 됩니다.

이때 점수가 아닌 ranking 으로 입력이 들어오므로

서류 점수를 index,

면접 점수를 value로 해서 입력을 받아봅시다.

그럼 자연스럽게 서류 점수순으로 정렬되어 면접 점수가 저장이 됩니다.

i 번째 지원자의 합불 여부는 어차피 서류 점수는 내림차순으로 정렬되어 있기 때문에

i - 1번째 지원자보다 어차피 낮고, 면접 점수가 높아야만 합격이 되므로

앞서 등장한 최소 면접 랭킹만 확인하여 i 번째 지원자의 랭킹이 높으면 합격입니다.

  

코드로 구현해봅시다.

시간 초과가 뜨므로 속도 향상을 위해 아래와 같은 코드를 넣고

import sys
input = sys.stdin.readline

 

T 번 반복하며

T = int(input())

 

cnt는 1, 

n은 입력

서류 점수를 index, 면접 점수를 value로 하는 list를 초기화 해줍니다.

cnt = 1
n = int(input())
grade = [0 for _ in range(n+1)]

 

서류 점수를 index, 면접 점수를 value로 값을 입력하여 list에 저장합니다.

for _ in range(1, n+1):
    a, b = map(int, input().split())
    grade[a] = b

 

이후  지금까지의 면접점수의 최저 랭킹은 서류 점수 1등 지원자의 점수로 초기화 한 후

Min = grade[1]

 

2번 지원자부터 검사하여 커트라인보다 랭킹이 높으면 커트라인을 업데이트 하고

(이후의 지원자들은 서류 점수에서 지고 있는 상황이므로 면접 점수에서 지면 합격할 수 없음)  

합격자수를 업데이트 한 후 출력해줍니다.

for i in range(2, n+1):
    if grade[i] < Min:
        Min = grade[i]
        cnt += 1
print(cnt)

 

 

Python 백준 1946 번 신입 사원 최종 코드입니다. 

import sys
input = sys.stdin.readline

T = int(input())
for _ in range(T): #T번 반복
    cnt = 1
    n = int(input())
    grade = [0 for _ in range(n+1)]

    for _ in range(1, n+1):
        a, b = map(int, input().split())
        grade[a] = b

    Min = grade[1]

    for i in range(2, n+1):
        if grade[i] < Min:
            Min = grade[i]
            cnt += 1
    print(cnt)

 

지금까지 백준 1946 번 Python 코드와 자세한 설명이었습니다.

감사합니다.

728x90
반응형