상근이는 퀴즈쇼의 PD이다. 이 퀴즈쇼의 참가자는 총 8개 문제를 푼다. 참가자는 각 문제를 풀고, 그 문제를 풀었을 때 얻는 점수는 문제를 풀기 시작한 시간부터 경과한 시간과 난이도로 결정한다. 문제를 풀지 못한 경우에는 0점을 받는다. 참가자의 총 점수는 가장 높은 점수 5개의 합이다.
상근이는 잠시 여자친구와 전화 통화를 하느라 참가자의 점수를 계산하지 않고 있었다. 참가자의 8개 문제 점수가 주어졌을 때, 총 점수를 구하는 프로그램을 작성하시오.
8개 줄에 걸쳐서 각 문제에 대한 참가자의 점수가 주어진다. 점수는 0보다 크거나 같고, 150보다 작거나 같다. 모든 문제에 대한 점수는 서로 다르다. 입력으로 주어지는 순서대로 1번 문제, 2번 문제, ... 8번 문제이다.
첫째 줄에 참가자의 총점을 출력한다. 둘째 줄에는 어떤 문제가 최종 점수에 포함되는지를 공백으로 구분하여 출력한다. 출력은 문제 번호가 증가하는 순서이어야 한다.
import java.util.*;
public class baek_2822 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0; // 점수 합계 변수 생성
int arr[][] = new int[8][2]; // 배열 생성
int arr2[] = new int[5]; // 가장 높은 점수의 번호 5개를 저장할 배열
for(int i=0; i<8; i++) { // 반복문
arr[i][0] = sc.nextInt(); // 점수 입력받기
arr[i][1] = i+1; // 문제 번호 배열에 넣기
}
Arrays.sort(arr, new Comparator<int[]>() { // 2차원 배열 내림차순으로 정렬
@Override
public int compare(int[] a, int[] b) {
return b[0] - a[0];
}
});
for(int i=0; i< 5; i++) { // 반복문
sum += arr[i][0]; // sum에 점수를 저장했던 배열의 값을 저장
arr2[i] = arr[i][1]; // 정렬을 통해 높아진 5개의 번호값을 배열에 넣어줌.
}
Arrays.sort(arr2); // 번호를 순서대로 출력하기 위해 정렬을 해줌.
System.out.println(sum); // 점수 합계 출력문
for(int i=0; i<5; i++) {
System.out.print(arr2[i] + " "); // 번호 출력문
}
sc.close();
}
}
문제가 이해가 되지만 어떻게 코드를 짜야할 지 감이 안왔었습니다. 여러가지를 생각하다가 2차원 배열을 떠올리게 되었습니다.
가장 높은 점수 5개의 합을 구하기 위해 점수를 내림차순으로 정렬한 뒤 점수는 총 합을 구하고, 문제 번호는 sort를 이용해 출력문을 작성해줍니다.
2차원배열에 점수와 번호를 입력받고, Arrays.sort를 사용해 2차원 배열을 정렬했습니다. 2차원 배열을 내림차순으로 정렬하기 위해 new Comparator을 선언하고 compare을 이용했습니다.
compare(int[] a, int[] b)는 음수, 0, 양수로 return 값을 결정하게 됩니다.
예를 들어 a가 3이고 b가 5라면 결과는 -2로 음수가 나오기 때문에 a, b 순으로 return이 됩니다.
하지만 a가 5, b가 3이라면 결과는 2로 양수가 나오게 됩니다. 양수가 나올 때는 b, a순으로 내림차순이 완성됩니다.
(만약 오름차순으로 진행하려면 retrun a[0] - b[0];로 바꿔주면 됩니다.)
이 문제를 통해 어려웠던 2차원 배열의 정렬을 알게 되었습니다.