문제(출처: https://www.acmicpc.net/problem/23246)
< Sport Climbing Combined >
문제 풀이
순위의 곱과 합을 구한 후 ArrayList에 [등번호, 합산 접수, 곱한 점수] 배열 형태로 저장한다. 곱한 점수 기준으로 오름차순, 곱한 점수가 같다면 합산 점수 기준으로 오름차순, 합산 점수가 같다면 등번호 기준으로 오름차순으로 정렬한다.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
public class _23246_ { // Sport Climbing Combined
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(bf.readLine());
ArrayList<int[]> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(bf.readLine());
int num = Integer.parseInt(st.nextToken());
int sum = 0;
int score = 1;
for (int j = 0; j < 3; j++) {
int x = Integer.parseInt(st.nextToken());
sum += x;
score *= x;
}
list.add(new int[] { num, sum, score });
}
Collections.sort(list, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[2] == o2[2]) {
if (o1[1] == o2[1]) {
return o1[0] - o2[0];
}
return o1[1] - o2[1];
}
return o1[2] - o2[2];
}
});
for (int i = 0; i < 3; i++) {
bw.write(list.get(i)[0] + " ");
}
bw.flush();
}
}
변수)
n : 선수의 명수
list : ArrayList <int []>
num : 등번호
sum : 합산 점수
score : 곱한 점수
선수의 명수를 입력받는다. 선수 수만큼 각 등번호와 순위를 입력받으면서 순위 합과 곱을 구해 ArrayList에 배열 형태로 저장한다. ArrayList를 곱한 점수 기준 오름차순으로, 곱한 점수가 같다면 합산 점수 기준 오름차순으로, 합산 점수가 같다면 등번호 기준 오름차순으로 정렬한다.
최종 ArrayList의 0번째부터 2번째까지의 등번호를 출력한다.
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 12887_경로 게임 (0) | 2024.06.14 |
---|---|
[Baekjoon] 29891_체크포인트 달리기 (0) | 2024.06.13 |
[Baekjoon] 25325_학생 인기도 측정 (0) | 2024.06.11 |
[Baekjoon] 15702_중간고사 채점 (0) | 2024.06.10 |
[Baekjoon] 11971_속도 위반 (0) | 2024.06.07 |