문제
영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ score[0], score[1] ≤ 100
- 1 ≤ score 의 길이 ≤ 10
- score 의 원소 길이는 2입니다.
- score 는 중복된 원소를 갖지 않습니다.
import java.util.*;
class Solution {
public int[] solution(int[][] score) {
int[] answer = new int[score.length];
List<Integer> avgListSort = new ArrayList<Integer>();
for(int[] scr : score) {
int avg = scr[0]+scr[1];
avgListSort.add(avg);
}
List<Integer> avgList = new ArrayList<Integer>(avgListSort);
avgListSort.sort(Comparator.reverseOrder());
int rank = 0;
for(int i = 0; i < avgList.size(); i++) {
int idx = avgList.indexOf(avgListSort.get(i));
if(i > 0 && avgListSort.get(i-1).equals(avgListSort.get(i))) {
answer[idx] = rank;
avgList.set(idx, -1);
continue;
}
answer[idx] = i+1;
avgList.set(idx, -1);
rank = i+1;
}
return answer;
}
}
자료형 int와 래퍼 클래스 Integer로 인해 비교연산에서 쓸데없이 시간을 많이 잡아먹었던 문제이다.
int는 "=" 연산으로 서로 비교가 가능하지만 Integer는 래퍼클래스이기 때문에 주소 값을 비교해 버린다.
즉, int로 선언된 a, b가 서로 같은 값이라면 a = b -> True 가 나오지만,
Integer로 선언된 a, b가 서로 정수 값은 같을지라도 주소값이 다르기 때문에 a = b -> False 가 나온다.
그런데 int a 와 Integer b 가 서로 같은 정수값이라면 이럴 땐 a = b -> True 가 나온다.
그래도 이번을 계기로 다시는 실수하지 않을 것 같다. 물론 코드가 길면 언젠가 한 번은 또 실수할 테니 유의해야겠다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/120882