일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 혁펜하임강의후기
- AIDEEPDIVE
- precision
- 백준
- 조건문
- 백준C++
- 패스트캠퍼스혁펜하임
- tensorflow
- 패스트캠퍼스
- 비교연산자
- cuDNN
- 백준9095
- 9095
- c++ 기초
- pytorch
- 백준1026
- 혁펜하임강의
- 혁펜하임
- C++ 공백 입력
- C++
- 1로만들기
- 반복문
- C++ 백준
- 백준1463
- for문
- 1463
- CUDA
- C++ 함수
- 혁펜하임AI
- AI강의
- Today
- Total
코딩하는 덕구 🐶
77. Python 백준 1946 번 신입 사원 자세한 설명 본문
안녕하세요 코딩하는 덕구입니다.
그리디 알고리즘 문제인 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 코드와 자세한 설명이었습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
79. Python 백준 1012 번 유기농 배추 자세한 설명 (0) | 2023.01.13 |
---|---|
78. C++ 백준 1946 번 신입 사원 자세한 설명 (0) | 2023.01.11 |
76. C++ 백준 11726 번 2Xn 타일링 자세한 설명 (0) | 2023.01.11 |
75. Python 백준 11726 번 2Xn 타일링 자세한 설명 (0) | 2023.01.11 |
74. C++ 백준 2667 단지 번호 붙이기 자세한 설명 (1) | 2023.01.11 |