코딩테스트/기타

[배열] 등수구하기 .java

머밍 2024. 10. 20. 23:16

설명

N명의 학생의 국어점수가 입력되면 각 학생의 등수를 입력된 순서대로 출력하는 프로그램을 작성하세요.

같은 점수가 입력될 경우 높은 등수로 동일 처리한다.

즉 가장 높은 점수가 92점인데 92점이 3명 존재하면 1등이 3명이고 그 다음 학생은 4등이 된다.

입력

첫 줄에 N(3<=N<=100)이 입력되고, 두 번째 줄에 국어점수를 의미하는 N개의 정수가 입력된다.

출력

입력된 순서대로 등수를 출력한다.

예시 입력 1 

5
87 89 92 100 76

예시 출력 1

4 3 2 1 5

 

내 풀이

1. 입력 받은 배열을 오름차순으로 정렬한 배열 sorted

2. sorted 배열을 사용하여 같은 점수가 입력될 경우 높은 등수로 동일처리 하기 위한 배열 ranks

3. sorted 배열의 마지막 인덱스가 1등이기에 뒤부터 순차적으로 비교

-> 동일한 점수 -> 등수 유지

-> 다른 점수 -> 동일한 등수의 개수 빼고 등수 계산 (n-i)

4. sorted와 ranks의 인덱스는 동일하기에 sorted 인덱스를 기준으로 입력받은 점수가 같으면 그 값을 가지는 인덱스의 ranks 값 (등수) 를 answer 배열에 저장

 

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        //오름차순 정렬
        int[] sorted = Arrays.copyOf(arr, n);
        Arrays.sort(sorted);

        int[] answer = new int[n];
        //등수 저장할 배열
        int[] ranks = new int[n];

        //현재 등수는 1등
        int cur =1;
        ranks[n-1] = cur;//마지막 인덱스가 1등

        for(int i = n-2; i>=0; i--) {//현재와 뒤의 값을 비교
            if(sorted[i] == sorted[i+1]) {//값이 같으면 등수 유지
                ranks[i] = cur;
            } else {
                cur = n - i;//동일한 등수의 개수 빼고 이어서
                ranks[i] = cur;//갱신
            }
        }

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(sorted[i] == arr[j]) {
                    answer[j] = ranks[i];
                }
            }
            }

        for(int i = 0; i < n; i++){
            System.out.print(answer[i] + " ");
        }


    }
}

 

다른 풀이 - 하나의 배열로만

1. 이중 for문 i,j (0~4) -> 각 i 마다 자기 자신 말고 다른 값(j)와 비교하여 등수를 갱신

2. 입력받은 arr 배열의 첫 번째 학생의 등수는 1로 설정(변수 cnt)

3. arr[j] > arr[i] -> 자신보다 큰 숫자가 발견되었으므로 등수 증가

 

=> 즉, 같은 값이 존재해도 자기 자신보다 큰 수가 발견되면 등수를 증가하기 때문에 문제의 조건을 만족

 

import java.util.Scanner;

public class Main {
    public int[] solution(int n, int[] arr){
        int[] answer = new int[n];

        for(int i = 0; i < n; i++){
            int cnt = 1;
            for(int j = 0; j < n; j++){
                if(arr[i] < arr[j]){
                    cnt++;
                }
            }
            answer[i] = cnt;
        }
        return answer;
    }
    
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        for(int i : T.solution(n,arr)) System.out.print(i + " ");



    }
}

 

 

💡💡

Arrays.sort()를 사용하고 싶어 여러 가지로 생각했던 문제였는데 하나의 배열안에서 현재 점수보다 큰 값만 따로 계산하면 간단한 문제였다 이렇게 간단한 걸 너무 어렵게 접근했다