프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 등수 매기기(Java)

Sigfriede 2023. 7. 6. 01:00

  문제 설명

  영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return 하도록 solution 함수를 완성해주세요.

 

  제한사항

  • 0 <= score[0], score[1] <= 100
  • 1 <= score의 길이 <= 10
  • score의 원소 길이는 2입니다.
  • score는 중복된 원소를 갖지 않습니다.

 

  입출력 예

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]
import java.util.Arrays;
import java.util.HashMap;
class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        int[] array = new int[score.length];
        for (int i = 0; i < score.length; i++) {
            array[i] = score[i][0] + score[i][1];
        }
        int[] sortedArray = Arrays.copyOf(array, array.length);
        Arrays.sort(sortedArray);
        HashMap<Integer, Integer> map = new HashMap<>();
        int rank = 1;
        for (int i = sortedArray.length - 1; i >= 0; i--) {
            if (!map.containsKey(sortedArray[i])) {
                map.put(sortedArray[i], rank);
            }
            rank++;
        }
        for (int i = 0; i < array.length; i++) {
            answer[i] = map.get(array[i]);
        }
        return answer;
    }
}

  배열 answer와 array를 생성합니다. 크기는 score의 길이와 동일합니다.

  for문이 score의 길이만큼 순회합니다.

  array의 i 번째 원소에 score[i][0] 번째 원소와 score[i][1] 번째 원소를 더한 값을 할당합니다. 평균을 구하는 문제임에도 나누기 연산을 하지 않는 이유는 길이가 2로 고정되었기 때문입니다. 만약 길이가 들쭉날쭉하여 원소의 길이만큼 나누어 평균을 구해야 한다면 소수점까지 고려하여 double형으로 나누어주어야 합니다. 예를 들어 이 문제에서는 평균을 구하고자 한다면 원소의 총합에서 2.0으로 나눠야 합니다.

  배열 sortedArray를 생성하여 Arrays 클래스의 copyOf 메소드를 이용하여 array를 복사합니다.

  sort 메소드를 이용하여 sortedArray를 오름차순으로 정렬합니다.

  Integer를 제네릭 타입으로 갖는 HashMap을 생성합니다.

  등수를 매길 변수 rank를 생성합니다. 1등부터 시작하므로 1로 초기화 합니다.

  for문이 sortedArray의 길이 - 1에서 0까지 역순으로 순회합니다.

  if문에서 containsKey 메소드를 이용하여 sortedArray의 i 번째 원소가 있는지 확인합니다. 이는 중복되는 점수를 확인하기 위함입니다. 없다면 put 메소드를 이용하여 sortedArray의 i 번째 원소와 rank를 map에 삽입합니다.

  rank가 증가합니다.

  for문이 array의 길이만큼 순회합니다.

  answer의 i 번째 원소에 get 메소드를 이용하여 map의 array의 i 번째 원소가 키인 값을 가져옵니다.