[BaekJoon] 1205 등수 구하기

오태호·2021년 12월 17일
0

1.  문제 링크

https://www.acmicpc.net/problem/1205

2.  문제

요약

  • 등수는 위에서부터 몇 번째 있는 점수인지로 결정되고, 같은 점수는 가장 작은 등수로 등록됩니다. 랭킹 리스트에 올라갈 수 있는 개수는 정해져있어서 이 개수를 넘는 곳에 위치하게 된다면 그 점수는 랭킹 리스트에 올라갈 수 없습니다.
  • 입력: 첫째 줄에서는 리스트에 있는 점수 개수, 새로운 점수, 랭킹 리스트에 올라갈 수 있는 점수의 개수를 입력받습니다. 둘째 줄에서는 리스트에 있는 점수 개수만큼 점수를 입력받습니다.
  • 출력: 새로운 점수의 등수를 출력합니다.

3.  소스코드

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
import java.util.Collections;

public class Main {
    public int rank(int p, int score, Integer[] scores) {
        Arrays.sort(scores, Collections.reverseOrder());
        // Case 1. 기존에 점수가 없을 경우
        if(scores.length == 0) {
            return 1;
        // Case 2. 기존의 점수가 최대 개수만큼 다 차있을 경우
        } else if(scores.length == p) {
            // Case 2 - 1. 기존의 점수들에서 가장 작은 점수와 같다면
            if(score == scores[scores.length - 1]) {
                return -1;
            // Case 2 - 2. 그렇지 않다면
            } else {
                int index = -1;
                for(int i = 0; i < scores.length; i++) {
                    if(scores[i] <= score) {
                        index = i;
                        break;
                    }
                }
                
                if(index == -1) {
                    return -1;
                } else {
                    return index + 1;
                }
            }
        // Case 3. 이외의 경우
        } else {
            int index = -1;
            for(int i = 0; i < scores.length; i++) {
                if(scores[i] <= score) {
                    index = i;
                    break;
                }
            }
            
            if(index == -1) {
                return scores.length + 1;
            } else {
                return index + 1;
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        StringTokenizer st = new StringTokenizer(input);
        int n = Integer.parseInt(st.nextToken());
        int score = Integer.parseInt(st.nextToken());
        int p = Integer.parseInt(st.nextToken());
        if(n != 0) {
            input = br.readLine();
            st = new StringTokenizer(input);
        }
        Integer[] scores = new Integer[n];
        for(int i = 0; i < n; i++) {
            scores[i] = Integer.parseInt(st.nextToken());
        }
        
        Main m = new Main();
        System.out.println(m.rank(p, score, scores));
    }
}

4.  접근

  1. 기존에 등록되어있는 점수가 없을 경우
    • 등록되어 있는 것이 없기 때문에 새로운 점수는 항상 1등이 됩니다.
  2. 기존에 등록되어있는 점수가 랭킹 리스트에 올라갈 수 있는 점수의 개수만큼 등록되어 있는 경우
    • 새로운 점수가 기존에 등록되어 있는 점수들 중에서 가장 작은 점수와 같다면, 이미 랭킹 리스트에 등록되어 있는 숫자만큼 등록이 되어 있기 때문에 문제에 의해 등록될 수 없습니다.
    • 그렇지 않은 경우, 새로운 점수가 어디에 위치할지 위치를 찾고 그 위치가 랭킹 리스트에 등록될 수 있는 점수 개수를 넘어서는 경우에는 랭킹 리스트에 등록할 수 없습니다. 기존에 등록되어있던 점수들 사이에 위치할 수 있다면 해당 위치에 맞는 등수를 반환합니다.
    • 중복되는 점수가 되는 경우에는 문제에 의해 가장 작은 등수로 등수가 측정된다고 하였으므로 가장 작은 등수로 반환합니다.
  3. 기존에 등록되어있는 점수가 랭킹 리스트에 올라갈 수 있는 점수의 개수보다 적은 경우
    • 기존에 랭킹 리스트에 존재하고있는 점수의 개수가 랭킹 리스트에 올라갈 수 있는 점수의 개수보다 적으므로 새로 들어온 점수는 항상 랭킹 리스트에 등록될 수 있습니다.
    • 새로운 점수가 위치할 곳을 등록된 점수들을 돌면서 찾고, 그 위치가 가장 끝이라면 기존에 등록되어있는 점수 개수 + 1을 반환하고 그렇지 않다면 해당 위치에 맞는 등수를 반환합니다.
    • 중복되는 점수가 되는 경우에는 문제에 의해 가장 작은 등수로 등수가 측정된다고 하였으므로 가장 작은 등수로 반환합니다.
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글