백준 1205 자바

손찬호·2024년 9월 6일
0

알고리즘

목록 보기
89/91

풀이 아이디어

새로운 점수가 랭킹에 들어갈 수 있는지를 확인하는 문제로
케이스는 크게 4가지가 있었다.

  1. 랭킹에 자리가 남았고(n<pn<p), 새로운 점수보다 작은 점수가 있는 경우
    -> 랭킹에 같은 점수가 있다면 같은 점수의 가장 낮은 등수를 출력,
    같은 점수가 없다면 작은 점수에 해당하는 등수를 출력

  2. 랭킹에 자리가 남았고(n<pn<p), 새로운 점수보다 크거나 같은 점수만 있는 경우
    -> 랭킹에 같은 점수가 있다면 같은 점수의 가장 낮은 등수를 출력,
    같은 점수가 없다면 "n+1"을 출력 (인덱스는 0에서 시작하므로)

  3. 랭킹에 자리가 꽉 찼고(n==pn==p), 새로운 점수보다 작은 점수가 있는 경우
    -> 랭킹에 같은 점수가 있다면 같은 점수의 가장 낮은 등수를 출력,
    같은 점수가 없다면 작은 점수에 해당하는 등수를 출력

  4. 랭킹에 자리가 꽉 찼고(n==pn==p), 새로운 점수보다 크거나 같은 점수만 있는 경우
    -> 들어갈 자리가 없으므로 "-1" 출력

풀이 코드

import java.util.*;
import java.io.*;

public class _1205 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 랭킹에 등록된 점수의 개수
        int newScore = Integer.parseInt(st.nextToken()); // 새로운 점수
        int p = Integer.parseInt(st.nextToken()); // 랭킹에 등록할 수 있는 점수의 수
        ArrayList<Integer> scores = new ArrayList<>();
        // 점수가 없는 경우
        if(n==0){
            System.out.println(1);
            return;
        }

        st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++){
            scores.add(Integer.parseInt(st.nextToken()));
        }
        // 내림차순 정렬 
        Collections.sort(scores, Collections.reverseOrder());
        // System.out.println(scores);
        
        // n<p인 경우
        // n==p인 경우
        // 새로운 점수보다 작은 점수가 있는 경우
        // 새로운 점수보다 작은 점수가 없는 경우

        // n<p인 경우
        if(n<p){
            // 새로운 점수보다 작은 점수가 있는 경우
            for(int i=0; i<n; i++){
                if(scores.get(i)<newScore){
                    // i-1번째에 같은 점수들이 있는 경우
                    while(i>=1 && scores.get(i-1)==newScore){
                        i--;
                    }
                    System.out.println(i+1);
                    return;
                }
            }
            // 새로운 점수보다 작은 점수가 없는 경우
            // 이전에 같은 점수가 있는지 확인
            while(n>=1 && scores.get(n-1)==newScore){
                n--;
            }
            System.out.println(n+1);
        }
        // n==p인 경우
        else if(n==p){
            // 새로운 점수보다 작은 점수가 있는 경우
            for(int i=0; i<p; i++){
                if(scores.get(i)<newScore){
                    // i-1번째에 같은 점수들이 있는 경우
                    while(i>=1 && scores.get(i-1)==newScore){
                        i--;
                    }
                    System.out.println(i+1);
                    return;
                }
            }
            // 새로운 점수보다 작은 점수가 없는 경우
            System.out.println(-1);
        }
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보