본문 바로가기
프로그래머스/[프로그래머스 - JAVA] Lv.0

[프로그래머스 - JAVA] 등수 매기기

by 코딩하는 흰둥이 2023. 3. 16.
반응형


입출력 예

score result
[[80, 70], [90, 50], [40, 70], [50, 80]] [1, 2, 4, 3]
[[80, 70], [70, 80], [30, 50], [90, 100], [100, 90], [100, 100], [10, 30]] [4, 4, 6, 2, 2, 1, 7]

 

입출력 예 설명

입출력 예 #1

  • 평균은 각각 75, 70, 55, 65 이므로 등수를 매겨 [1, 2, 4, 3]을 return합니다.

 

입출력 예 #2

  • 평균은 각각 75, 75, 40, 95, 95, 100, 20 이므로 [4, 4, 6, 2, 2, 1, 7] 을 return합니다.
  • 공동 2등이 두 명, 공동 4등이 2명 이므로 3등과 5등은 없습니다.

  • 내 풀이
class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        int count = 0;
        int[] average = new int[score.length];

        for (int i = 0; i < score.length; i++) {
            average[i] = (score[i][0] + score[i][1]) / 2;
        }
        
        for (int i = 0; i < average.length; i++) {
            count = 1;
            for (int j = 0; j < average.length; j++) {
                answer[i] = 1;
                if(average[i] < average[j]){
                    count++;
                }
            }
            answer[i] = count;
        }
        return answer;
    }
}

위의 예제는 소수점 자리를 고려하지 않아 올바른 등수를 표시 할 수 없었다(12개 테스트 중 10개 성공)

예) {1 , 3}  {1, 1} .... 중에  두 배열의 값의 평균을 구하면 1.5 와 1 이지만 두 값을 비교하지 않고 그냥 배열에 넣게 되면 

소숫점 자리는 들어가지 않게 되어 두 배열에 1 과 1이 들어간다

그래서 등수를 매길 때 같은 평균으로 인식하여 등수가 계속 뒤로 밀리는  현상이 생겼다. 

결론은 그냥 평균을 구해서 배열에 넣는게 아니라 앞의 평균과 뒤의 평균의 크기를 비교해야 한다는 점이다

 

  • 내 풀이(성공)
class Solution {
    public int[] solution(int[][] score) {
//        int[][] score = {{80, 70}, {90, 50}, {40, 70}, {50, 80}};
//        int[][] score = {{80, 70}, {70, 80}, {30, 50}, {90, 100}, {100, 90}, {100, 100}, {10, 30}};
//        int[][] score = {{1, 2}, {1, 1}, {1, 1}};
//        int[][] score = {{1,1}, {2,1}, {3,1}, {4,1}, {5,1}, {6,1}, {7,1}, {8,1}, {9,1}, {0,0}};
//        답 [9,8,7,6,5,4,3,2,1,10]
//        int[][] score = {{0, 20}, {80, 100}, {10, 10}, {90, 90}, {20, 0}};
        //-> [3, 1, 3, 1, 3]

	// 매개변수의 크기로 초기화
        int[] answer = new int[score.length];
        int count = 0;
		
        // 첫 배열의 평균을 순서대로 비교해야 하기 때문에 이중for문을 사용한다.
        for (int i = 0; i < score.length; i++) {
        // 처음엔 모두 1등부터 시작해서 자신보다 큰 점수가 있으면 + 한다.
            count = 1;
          // 첫 배열의 평균을 i 로 잡고 순차적으로 비교할 값을 j로 한다
            for (int j = 0; j < score.length; j++) {
            // 자신의 평균보다 큰 수가 없을 수도 있기 때문에 answer[i]에 1을 넣어 놓았다
                answer[i] = 1;
            // 첫 배열의 합한 값과 다음 배열의 합한 값의 크기를 비교한다
                if((score[i][0] + score[i][1]) < (score[j][0] + score[j][1])){
                    // 자신보다 큰 점수가 있기 때문에 등수를 뒤로 밀어주어야 한다.
                    count++;
                }
            }
            answer[i] = count;
        }

        return answer;
    }
}

 

 

 

 

  • 다른 사람 풀이
import java.util.*;
class Solution {
    public int[] solution(int[][] score) {
        List<Integer> scoreList = new ArrayList<>();
        for(int[] t : score){
            scoreList.add(t[0] + t[1]);
        }
        scoreList.sort(Comparator.reverseOrder());

        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;
    }
}

댓글