# 문제
# 입력 및 출력
# 풀이
처음에 문제를 풀땐 서류심사 성적과 면접 성적을 둘 다 비교하도록 했다
이미 서류 심사 성적을 내림차순으로 정렬해둔 상태에서 또 비교를 해서 반복문이 3중이 되어 시간 초과 문제가 발생했음
cout, cin 문제일까 싶어서 printf, scanf, \n로 바꿔봐도 문제는 똑같았음
아래가 처음 작성한 코드다
#include <iostream>
#include <vector>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
vector < pair<int, int> > a;
int compare() {
int count = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i].first == 1 || a[i].second == 1) {
count++;
continue;
}
int j = i - 1;
int right = 1;
while (j >= 0) {
if (a[i].first - a[j].first > 0 && a[i].second - a[j].second > 0) {
right = 0;
break;
}
j--;
}
if (right) count++;
}
return count;
}
int main() {
int T, N;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d", &N);
for (int j = 0; j < N; j++) {
int tmp1, tmp2;
scanf("%d %d", &tmp1, &tmp2);
a.push_back(make_pair(tmp1, tmp2));
}
sort(a.begin(), a.end());
printf("%d\n", compare());
a.clear();
}
}
compare함수에서 while문이 쓸데없이 돌고있는게 문제였다
이미 서류심사 성적을 내림차순 정렬해둔 상태에서
자신보다 서류심사 성적이 높은 사람들의 면접 성적을 모두 조회할 할 필요가 없는 것이다
말이 좀 헷갈리는데 첫번째 케이스로 예를 들어 정리하자면
서류심사 성적으로 내림차순 되어 있어
1 4
2 3
3 2
4 1
5 5
이런식으로 벡터가 정렬되어 있고 3 2 성적을 가진 사람을 기준으로 보면 자신보다 서류 성적이 낮은 사람은 볼 필요가 없기 때문에 1 4, 2 3 인 사람의 면접 성적만 보면 된다
여기서 두명의 면접 성적을 볼 때 가장 높은 면접 성적을 가진 사람을 기준으로 보면 이 사람이 최종적으로 통과할 수 있는지를 확인할 수 있음
세번째 사람을 기준으로 보면 면접 심사를 2등을 했으므로 4등, 3등보다 높은 점수를 받았다
따라서 세번째 사람은 최종적으로 통과한 것이다
이걸 코드로 정리하면
#include <iostream>
#include <vector>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
vector < pair<int, int> > a;
int main() {
int T, N, count = 0;
int minv = 100001;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d", &N);
for (int j = 0; j < N; j++) {
int tmp1, tmp2;
scanf("%d %d", &tmp1, &tmp2);
a.push_back(make_pair(tmp1, tmp2));
}
sort(a.begin(), a.end());
for (int j = 0; j < a.size(); j++) {
if (minv > a[j].second) {
count++;
minv = min(minv, a[j].second);
}
}
printf("%d\n", count);
a.clear();
minv = 100001;
count = 0;
}
}
쓸데없는 compare 함수는 지울 수 있고 반복문도 최대 이중 포문이 된다
minv의 디폴트값을 100,001로 잡은 이유는 등수(N)가 최대 100,000이기 때문이다
알고리즘 풀이는 아래 블로그 참고
[백준 1946번 : 신입 사원] - 시간초과
1. 문제 문제 설명 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사 신규 사원 채용을 실시한다. 인...
blog.naver.com
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#2667 단지번호붙이기 (0) | 2022.05.03 |
---|---|
#2178 미로 탐색 (0) | 2022.05.02 |
#10610 30 (0) | 2022.04.28 |
#11279 최대 힙 (0) | 2022.04.27 |
#1927 최소 힙 (0) | 2022.04.27 |
댓글