[배열] 등수구하기 .java
설명
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()를 사용하고 싶어 여러 가지로 생각했던 문제였는데 하나의 배열안에서 현재 점수보다 큰 값만 따로 계산하면 간단한 문제였다 이렇게 간단한 걸 너무 어렵게 접근했다