일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- for문
- c++ 기초
- precision
- 혁펜하임
- 9095
- CUDA
- pytorch
- 혁펜하임강의후기
- C++ 공백 입력
- 혁펜하임AI
- AIDEEPDIVE
- 비교연산자
- 패스트캠퍼스혁펜하임
- 백준1463
- C++
- 혁펜하임강의
- 1463
- tensorflow
- AI강의
- 백준
- C++ 함수
- 백준1026
- cuDNN
- 반복문
- 백준C++
- 백준9095
- 조건문
- 패스트캠퍼스
- 1로만들기
- C++ 백준
- Today
- Total
코딩하는 덕구 🐶
78. C++ 백준 1946 번 신입 사원 자세한 설명 본문
안녕하세요 코딩하는 덕구입니다.
그리디 알고리즘 문제인 1946 번 신입 사원 C++ 자세한 설명입니다.
https://www.acmicpc.net/problem/1946
1946번: 신입 사원
첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성
www.acmicpc.net
먼저 백준 1946 번 C++ 정답 코드입니다.
#include <iostream>
#define MAX 100001
using namespace std;
int grade[MAX] = {0, };
int main(){
int T, N, a, b, rank, cnt;
cin >> T;
for (int t = 0; t < T; t++){
cin >> N;
cnt = 1;
for (int i = 1; i <= N; i++){
cin >> a >> b;
grade[a] = b;
}
rank = grade[1];
for (int i = 2; i <= N; i++){
if ( grade[i] < rank ){
rank = grade[i];
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}
서류 점수, 면접 점수 둘 중 하나만 남들보다 높다면 입사시키면 되므로
면접과 서류 점수를 모두 비교하여 남들보다 높은게 하나라도 있을 때 입사자 수를 1개씩 증가시키면 됩니다.
이때 점수가 아닌 ranking 으로 입력이 들어오므로
서류 점수를 index,
면접 점수를 value로 해서 입력을 받아봅시다.
그럼 자연스럽게 서류 점수순으로 정렬되어 면접 점수가 저장이 됩니다.
i 번째 지원자의 합불 여부는 어차피 서류 점수는 내림차순으로 정렬되어 있기 때문에
i - 1번째 지원자보다 어차피 낮고, 면접 점수가 높아야만 합격이 되므로
앞서 등장한 최소 면접 랭킹만 확인하여 i 번째 지원자의 랭킹이 높으면 합격입니다.
이제 위의 직관을 코드로 구현해봅시다.
cnt는 1,
n은 입력
서류 점수를 index, 면접 점수를 value로 하는 행렬을 초기화 해줍니다.
cin >> N;
cnt = 1;
for (int i = 1; i <= N; i++){
cin >> a >> b;
grade[a] = b;
}
이후 지금까지의 면접점수의 최저 랭킹은 서류 점수 1등 지원자의 점수로 초기화 한 후
rank = grade[1];
2번 지원자부터 검사하여 커트라인보다 랭킹이 높으면 커트라인을 업데이트 하고
(이후의 지원자들은 서류 점수에서 지고 있는 상황이므로 면접 점수에서 지면 합격할 수 없음)
합격자수를 업데이트 한 후 출력해줍니다.
for (int i = 2; i <= N; i++){
if ( grade[i] < rank ){
rank = grade[i];
cnt++;
}
}
C++ 백준 1946 번 신입 사원 최종 코드입니다.
#include <iostream>
#define MAX 100001
using namespace std;
int grade[MAX] = {0, };
int main(){
int T, N, a, b, rank, cnt;
cin >> T;
for (int t = 0; t < T; t++){
cin >> N;
cnt = 1;
for (int i = 1; i <= N; i++){
cin >> a >> b;
grade[a] = b;
}
rank = grade[1];
for (int i = 2; i <= N; i++){
if ( grade[i] < rank ){
rank = grade[i];
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}
지금까지 백준 1946 번 C++ 코드와 함께 자세한 설명이었습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
80. C++ 백준 1012 번 유기농 배추 자세한 설명 (0) | 2023.01.13 |
---|---|
79. Python 백준 1012 번 유기농 배추 자세한 설명 (0) | 2023.01.13 |
77. Python 백준 1946 번 신입 사원 자세한 설명 (0) | 2023.01.11 |
76. C++ 백준 11726 번 2Xn 타일링 자세한 설명 (0) | 2023.01.11 |
75. Python 백준 11726 번 2Xn 타일링 자세한 설명 (0) | 2023.01.11 |