[문제]
https://softeer.ai/practice/info.do?idx=1&eid=1309&sw_prbl_sbms_sn=171753
[풀이]
문제도 단순하고 풀이도 단순한데 너무 쓸데없이 복잡하게 푼 느낌...
먼저 각 대회마다 모든 참가자들의 점수를 저장해주고 이를 내림차순으로 정렬한다. 그 후 등수를 매기면 된다.
주의할 점은 점수가 같다면 같은 등수를 유지하도록 해야한다는 것.
라이브러리에서 가져다 쓴 sort가 시간초과가 나서 직접 정렬을 구현해야 했으면 피곤했을 것 같다.
[코드]
import java.util.*;
import java.io.*;
public class Main
{
static int n;
public static class Contest{
int id, score;
Contest(int id, int score){
this.id = id;
this.score = score;
}
}
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
Contest[][] c = new Contest[4][n];
for(int i=0; i<3; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<n; j++){
c[i][j] = new Contest(j, Integer.parseInt(st.nextToken())); //참가자 번호, 점수
}
}
for(int i=0; i<n; i++){
int sum = 0;
for(int j=0; j<3; j++){
sum += c[j][i].score;
}
c[3][i] = new Contest(i, sum);
}
//3개의 대회에 대한 등수, 전체 등수 출력
//성적 순 내림차순 정렬
for(Contest[] con:c){
Arrays.sort(con, new Comparator<Contest>(){
@Override
public int compare(Contest o1, Contest o2) {
// TODO Auto-generated method stub
return Integer.compare(o2.score, o1.score);
}
});
}
int[][] r = new int[4][n];
for(int i=0; i<4; i++){
int rank = 1;
int cnt = 1;
r[i][c[i][0].id] = rank;
for(int j=1; j<n; j++){
//점수가 같으면 rank가 같은
if(c[i][j-1].score == c[i][j].score){
r[i][c[i][j].id] = rank;
cnt++;
}
else {
rank += cnt;
r[i][c[i][j].id] = rank;
cnt = 1;
}
}
}
for(int i=0; i<4; i++){
for(int j=0; j<n; j++){
System.out.print(r[i][j] + " ");
}
System.out.println();
}
}
}
'알고리즘 공부 및 문제 풀이 > 소프티어(SOF)' 카테고리의 다른 글
[sof] 소프티어 <인증평가(6차) 기출> 출퇴근길 - DFS (0) | 2023.04.12 |
---|---|
[sof] 소프티어 <인증평가 5차 기출> 업무 처리 - 이진 트리 (0) | 2023.04.03 |
[sof] 소프티어 <21년 재직자 대회 본선> 거리 합 구하기 (Java) - DFS, 트리 (0) | 2023.03.31 |
[sof] 소프티어 <인증평가 4차 기출> 통근버스 출발 순서 검증하기 (Java) - 구간합 (0) | 2023.03.31 |
[sof] 소프티어 <인증평가 4차 기출> 슈퍼컴퓨터 클러스터 (Java) - 이분탐색 (0) | 2023.03.31 |