기록하는 공부

[Programmers] 120882 등수 매기기 (Wrapper / Arrays.sort() / Collections.reverseOrder() / 내림차순 정렬) 본문

Language/Java

[Programmers] 120882 등수 매기기 (Wrapper / Arrays.sort() / Collections.reverseOrder() / 내림차순 정렬)

SS_StudySteadily 2023. 7. 28. 17:02
728x90
반응형

 

 

문제 출처

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120882

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 


 

 

나의 풀이

 

 

import java.util.*;

class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        double[] avgArr = new double[score.length];
        
        for(int i=0; i<score.length; i++) { //평균계산 후 avgArr에 저장
            avgArr[i] = (double)(score[i][0] + score[i][1])/2.0;
        }
        //sortArr을 avgArr 복사 후 Double형으로 박싱
        Double[] sortArr = Arrays.stream(avgArr).boxed().toArray(Double[]::new);  
        Arrays.sort(sortArr, Collections.reverseOrder());   //sortArr 내림차순 정렬
        
        for(int i=0; i<avgArr.length; i++) {    //avgArr값과 sortArr값이 같으면
            for(int j=0; j<sortArr.length; j++) {
                if(avgArr[i] == sortArr[j]) {
                    answer[i] = j+1;  //sortArr 인덱스 값을 answer에 입력
                    break;
                }
            }
        }
        
        return answer;
    }
}

 

 

처음에 실행했을 때, 테스트 1은 통과하지만 테스트 2는 계속 통과하지 못했다.

 

코드 수정 전 테스트 2 통과 실패

 

 

원인은 공동 2등이 2명, 공동 4등이 2명일 때 3등과 5등은 없어야 하는데 이 부분이 계산되지 않았기 때문이었다.

그래서 if문 하단에  break문을 넣자 성공적으로 통과할 수 있었다.

 

테스트 1, 2 통과

 

 

그리고 채점을 진행했는데 이번에는 테스트 3, 6번에서 실패했다.

평균을 계산할 때 정수형이 아닌 실수형으로 계산해야 하는 것 같다.

 

그래서 avgArr의 자료형을 double 형으로 바꾸고 박싱을 진행할 때

Double 형으로 바꿔서 코드를 수정했더니 성공할 수 있었다.

 

문제 풀이 성공

 

 

 

 


 

 

내림차순 정렬

 

 

오름차순Arrays.sort(배열명) 메서드를 활용하여 정렬할 수 있다.

하지만, 내림차순의 경우, Arrays.sort(배열명, Collections.reverseOrder())을 사용해야 한다.

이때, 주의할 점은 기본 자료형 배열인 경우에는 Collections.reverseOrder()을 사용할 수가 없다.

기본 자료형 배열에는 byte, short, int, long, char, float, double, boolean이 있다.

 

 

따라서 이런 경우에는 기본 자료형 배열을 Wrapper(래퍼) 클래스로 만든 후에 boxing을 해야 한다.

Wrapper(래퍼) 클래스기본 자료형의 데이터를 인스턴스(객체)로 만들기 위해 사용하는 클래스이다.

 

아래 기본형과 매칭이 되는 Wrapper 클래스 이미지를 참고해서 보자.

 

https://wiselog.tistory.com/23

 

 

그래서 double형으로 정의한 avgArr를 내림차순 정렬해 sortArr에 저장하기 위해서

Wrapper 클래스 Double을 사용했고 박싱을 진행했다.

 

//sortArr을 avgArr 복사 후 Double형으로 박싱
Double[] sortArr = Arrays.stream(avgArr).boxed().toArray(Double[]::new);

 

 

728x90
반응형