기록하는 개발자

[백준 1205번] 등수 구하기 - JAVA 알고리즘 본문

Baekjoon Online Judge

[백준 1205번] 등수 구하기 - JAVA 알고리즘

gitseok 2022. 6. 23. 11:25

1205번
문제
태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.
이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.
예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다
랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.
만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.
입력
첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다.
예제 입력 예제 출력
   
3 90 10
100 90 80
2

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException, ParseException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언

		StringTokenizer st = new StringTokenizer(br.readLine());

		int N = Integer.parseInt(st.nextToken());			//리스트 저장 개수
		int score = Integer.parseInt(st.nextToken());		//새로운 점수
		int rankCount = Integer.parseInt(st.nextToken());	//최저 등수
		
		if(rankCount == 0) {//최저 등수가 0이라면 [추가부분]
			bw.write("-1");
		}else if (N > 0) {	//리스트가 있다면
			
			st = new StringTokenizer(br.readLine());
			int[] rankList = new int[rankCount];
			int i = 0;
			
				
			
			while (st.hasMoreTokens()) { //배열에 점수 저장	
				rankList[i] = Integer.parseInt(st.nextToken());
				i++;
				
				if(i==rankCount) break; //최저등수를 넘길수 없음 [추가부분]
				
			}
			
			if (rankList[rankList.length - 1] >= score && N>=rankCount) { //최소 점수보다 작거나 같다면 [조건추가]
				bw.write("-1");
			}else if(rankList[0] <= score){ //최고점수보다 같거나 크다면
				bw.write("1");
			}else { //이외
				for (int j = rankList.length - 1; j >= 0; j--) {
					if (rankList[j] > score) { //새로운 점수보다 큰 점수의 뒤에 배치
						bw.write((j+2) + "");
						break;
					}
				}
			}
		} else {	//리스트가 없다면			
				bw.write("1");
         
		}
		
		bw.close();
		br.close();
	}
}

실행 결과

개인적으로 정리한 내용을 간단하게 풀어 작성했습니다.
이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다.
Comments