[알고리즘문제풀기] 등수 매기기

silver's avatar
Jan 30, 2025
[알고리즘문제풀기] 등수 매기기

문제

내가 작성한 오답

: 평균값을 구할 때 소수점 아래의 수가 나올 수도 있는데 int 배열에 저장을 했다.
import java.util.*; class Solution { public int[] solution(int[][] score) { Map<Integer,Integer> map = new HashMap<>(); Integer[] sorted = new Integer[score.length]; int[] rank = new int[score.length]; for(int i=0; i < score.length; i++){ rank[i] = ( score[i][0]+score[i][1])/2; sorted[i] = ( score[i][0]+score[i][1])/2; } Arrays.sort(sorted,Collections.reverseOrder()); for(int i = 0; i<score.length; i++){ if(i>0 && sorted[i].equals(sorted[i-1])){ map.put(sorted[i],map.get(sorted[i-1])); }else{ map.put(sorted[i],i+1); } } for(int i = 0; i<score.length; i++){ rank[i] = map.get(rank[i]); } return rank; } }

내가 작성한 정답

: int[] → Double[]로 변경하고 2로 나누지 않고 2.0으로 나눴다.
import java.util.*; class Solution { public int[] solution(int[][] score) { Map<Double, Integer> map = new HashMap<>(); Double[] sorted = new Double[score.length]; Double[] rank = new Double[score.length]; for(int i=0; i < score.length; i++){ rank[i] = (score[i][0]+score[i][1])/2.0; sorted[i] = (score[i][0]+score[i][1])/2.0; } Arrays.sort(sorted,Collections.reverseOrder()); for(int i = 0; i<score.length; i++){ if(i > 0 && sorted[i].equals(sorted[i-1])){ map.put(sorted[i],map.get(sorted[i-1])); }else{ map.put(sorted[i],i+1); } } int[] answer = new int[score.length]; for(int i = 0; i<score.length; i++){ answer[i] = map.get(rank[i]); } return answer; } }

다른 사람들의 정답

: 순위 구할거라 평균을 구할 필요없이 그냥 더한값으로 순위를 매기면 된다.
import java.util.*; class Solution { public int[] solution(int[][] score) { List<Integer> scoreList = new ArrayList<>(); // 2차원 배열 score를 순회하며 각 학생의 총 점수(영어 + 수학)를 리스트에 추가 for(int[] t : score){ scoreList.add(t[0] + t[1]); } // 총 점수를 내림차순으로 정렬 scoreList.sort(Comparator.reverseOrder()); // 결과 배열 초기화 int[] answer = new int[score.length]; // 각 학생의 순위를 계산하여 answer 배열에 저장 for(int i = 0; i < score.length; i++){ // 현재 학생의 총 점수의 인덱스를 찾아 순위를 계산 // indexOf는 리스트에서 해당 점수의 첫 번째 인덱스를 반환하므로 +1을 해줌 answer[i] = scoreList.indexOf(score[i][0] + score[i][1]) + 1; } return answer; } }
 
import java.util.Arrays; import java.util.Comparator; import java.util.stream.Collectors; class Solution { public int[] solution(int[][] score) { return Arrays.stream(score) // score 배열을 스트림으로 변환 .map(ints -> Arrays.stream(ints) // 각 학생의 점수를 스트림으로 변환 .average() // 평균을 계산 .orElse(0)) // 평균이 없을 경우 0을 반환 .mapToInt(d -> Arrays.stream(score) // 다시 score 배열을 스트림으로 변환 .map(ints -> Arrays.stream(ints) // 각 학생의 점수를 스트림으로 변환 .average() // 평균을 계산 .orElse(0)) // 평균이 없을 경우 0을 반환 .sorted(Comparator.reverseOrder()) // 평균 점수를 내림차순으로 정렬 .collect(Collectors.toList()) // 정렬된 평균 점수를 리스트로 수집 .indexOf(d) + 1) // 현재 학생의 평균 점수 d의 인덱스를 찾아 순위를 계산 (+1) .toArray(); // 최종 결과를 int 배열로 변환하여 반환 } }
notion image
Share article

silver