<문제 제시>
<문제설명>
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다.
영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때,
영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을
return하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
처음 접했을때는 간단한 문제라고 느껴졌다. 2차원배열에 담긴 값들 i 인덱스의 값을 더해 리스트에 저장하고
정렬을 통해 순위를 매기면 되지 않을까 싶었다.
하지만 문제에서 요구하는 출력 기준은 처음 주어진 2차원 배열의 값의 인덱스 순서대로 순위를 출력하는 것이었다.
Try 1)
int[] answer = {};
List<Integer> rank = new ArrayList<>();
List<Integer> rank_num = new ArrayList<>();
int sum = 0;
int fake_rank = 1000;
for(int i = 0; i < score.length; i++) {
for(int j = 0; j < score[i].length; j++) {
sum += score[i][j];
System.out.println(score[i][j] + "를 더하여 " + sum);
}
rank.add(sum);
rank_num.add(fake_rank + sum);
fake_rank += 1000;
sum = 0;
}
// 오름차순 정렬
Collections.sort(rank);
for(int i = 0; i < rank_num.size(); i++) {
for(int j = 0; j < rank.size(); j++) {
if(rank_num.get(i) == rank.get(i)) {
System.out.println("rank 재지정");
}
}
}
System.out.println(rank);
System.out.println(sum);
return answer;
fake_num이라는 변수로 1000, 2000, 3000, 4000 을 주어
점수에서 나름의 순서를 지정한 후
본 리스트에서 오름차순 정렬을 하여 그 값이 fake_num변수와 일치한다면 rank를 재지정하여 순위를 매기는
프로그램을 만들고자 하였으나 비효율적으로 보였고, rank_num.get(i) == rank.get(i) 하는 과정이
contains 메서드가 아니기 떄문에 1150과 150을 같다고 보진 않을 것이란 판단이 들었다.
Solution 1)
리스트를 사용하고, for-each문과 Collections.sort를 활용해보고자 하였다.
// 리스트에 각 수학,영어 점수를 합한 점수를 대입
List<Integer> scoreList = new ArrayList<>();
for(int[] t : score){
scoreList.add(t[0] + t[1]);
}
// 3번 - Collections.sort(리스트, Collections.reverseOrder()) 활용
Collections.sort(scoreList, Collections.reverseOrder());
입력받은 2차원배열의 값을 1차원배열 t로 보내고, 그 1차원배열의 첫번째값과 두번째값을 scoreList라는 리스트에 넣는다.
ArrayList를 정렬하기 위해서 필요한 Collections클래스의 sort를 이용하여 정렬하는데,
두번째 인자로 Collections.reverseOrder()를 주어 "내림차순"정렬을 수행한다.
다른 정렬방법으로
1. Comparator.reverseOrder() 활용
scoreList.sort(Comparator.reverseOrder());
2. Collections.sort() 후 Collections.reverse()로 정렬
Collections.sort(scoreList);
Collections.reverse(scoreList);
같은 방법 또한 존재한다.
<전체코드>
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ranking {
public static int[] solution(int[][] score) {
// 리스트에 각 수학,영어 점수를 합한 점수를 대입
List<Integer> scoreList = new ArrayList<>();
for(int[] t : score){
scoreList.add(t[0] + t[1]);
}
int[] answer = new int[score.length];
for(int i = 0; i < score.length; i++){
answer[i] = scoreList.indexOf(score[i][0] + score[i][1])+1;
}
return answer;
}
public static void main(String[] args) {
int[][] score = {{80, 70}, {90, 50}, {40, 70}, {50, 80}};
System.out.println(Arrays.toString(solution(score)));
}
}
for문에서 indexOf하는 부분을 살펴보면 scoreList는 내림차순 정렬된 상태이고,
score는 순서가 원본을 유지하고 있기때문에 score로부터 indexOf 메서드를 통해 인덱스를 불러오고
인덱스는 0부터 시작이므로 +1을 더해주어 등수를 1,2,3,4 매기게 된다.
키,값을 활용하는 Map자료구조를 사용하지 않고 ArrayList와 indexOf를 통해 해당 배열의 순서대로 순위를 매겨 출력하는 방법을 공부할 수 있었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120882
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '특이한 정렬' - Java (0) | 2023.07.13 |
---|---|
[프로그래머스] '로그인 성공?' - Java (0) | 2023.07.13 |
[프로그래머스] '유한소수 판별하기' - Java (0) | 2023.07.12 |
[프로그래머스] '달리기 경주' - Java (0) | 2023.05.21 |
[프로그래머스] '명예의 전당 (1)' - Java (0) | 2023.05.21 |