https://www.acmicpc.net/problem/14593
문제 분석
문제의 설명중 대부분은 실제 경시대회 규칙인듯하여, 중요한 부분만 뽑아 분석하자.
! 해결한 문제 점수의 총합이 높은 참가자가 더 높은 순위를 가진다.
! 점수의 총합이 같은 경우, 제출 횟수가 적은 참가자가 더 높은 순위를 가진다.
! 점수의 총합과 제출 횟수가 같은 경우, 마지막으로 점수를 획득한 문제의 업로드 시간이 빠른 참가자가 더 높은 순위를 가진다.
이 3가지 조건을 잊지말자.
입력 : 첫 번째 줄에는 참가자의 수 // 두 번째 줄부터 N개의 줄에 걸쳐 세개의 정수 S,C,L이 주어진다
출력 : 1등을 한 참가자의 번호를 출력한다.
코드
#include <iostream>
#include <string>
#include <algorithm>
#include<vector>
using namespace std;
struct score {
int s, c, l,ord;
};
bool compare(score a, score b) {
if (a.s == b.s && a.c == b.c ) return a.l < b.l;
// 점수의 총합과 제출 횟수가 같은 경우,
// 마지막으로 점수를 획득한 문제의 업로드 시간이 빠른 참가자가 더 높은 순위를 가진다.
if (a.s == b.s ) return a.c < b.c;
// 점수의 총합이 같은 경우, 제출 횟수가 적은 참가자가 더 높은 순위를 가진다.
return a.s > b.s;
// 해결한 문제 점수의 총합이 높은 참가자가 더 높은 순위를 가진다.
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<score> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].s >> v[i].c >> v[i].l;
v[i].ord = i+1;
}
sort(v.begin(), v.end(), compare);
cout << v[0].ord;
return 0;
}
문제 풀이
우선, 참가자의 등수를 판가름 할 수 있는 기준점이 3개나 입력으로 들어오기 때문에
여러모로 복잡할 수 있다.
그래서 참가자의 객체화(Struct 사용)을 통해 관리해주었다 + 참가자의 번호도 같이
참가자의 순위를 결정할 때에는 sort 함수를 사용하였는데, sort 함수의 3번째 인자를 이용하여
정렬을 본인의 입맛대로 할 수 있다.
1. 업로드 시간이 더 빠르다는 것은 크기가 작다는 뜻으므로 '<' 부등호를 사용하여 return한다.
2. 제출 횟수가 적은 것이 우선순위이므로 a.c < b.c의 bool 값을 return한다.
3. 모든 비교조건에 해당하지 않아, 점수의 총합을 비교해야할 땐 a.s > b.s의 bool 값을 return한다.
※ 복잡한 비교를 제일 상단의 if문안에 적어주어야 한다!
if(~~~){
if(~~~){
~~~
}
}
와 같이 이중 if문?을 사용하지 않으려면 말이다.
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준/C++] 16955번 오목, 이길 수 있을까? (0) | 2022.09.26 |
---|---|
[백준/C++] 2493번 탑 (0) | 2022.09.26 |
[백준/C++] 1316번 그룹 단어 체커 (0) | 2022.09.25 |
[백준/C++] 14561번 회문 (0) | 2022.09.25 |
[백준/C++] 1371번 가장 많은 글자 (0) | 2022.09.25 |