알고리즘 문제풀이/백준

#8979 : 올림픽

모항 2022. 7. 11. 17:49

풀이방법

사용된 것:

Comparator Overriding

 

2022.07.11

일단 문제에서 말한 기준대로 나라를 내림차순으로 쫙 정렬한다.

이렇게 정렬된 배열 상에서, K나라의 위치(인덱스)를 찾는다. 그 인덱스 값을 정수형 변수 answer에 저장해둔다.

만약 K나라와 동점인 나라가 하나도 없다면 answer+1이 답이다.

동점인 나라가 존재한다면 동점인 나라의 개수만큼을 answer에서 빼준 뒤에 1을 더하면 그것이 답이다.

 

따라서 아래의 과정을 통해 동점인 나라의 개수를 센다.

 

 

먼저 동점인 나라의 개수를 저장할 정수형 변수 cnt를 선언하고 0으로 초기화한다.

 

인덱스가 answer-1인 나라부터, 즉 K나라의 바로 직전 순서로 정렬되어있는 나라부터 시작하여 1등 나라(인덱스 0)까지 탐색한다.

탐색 중인 나라가 K나라와 동점이라면 cnt 값을 하나 늘린다.

탐색 중인 나라가 K나라와 동점이 아니라면, 그 나라부터 시작하여 더 앞의 나라들은 반드시 K나라보다 순위가 높다. 이제 모든 동점인 나라를 다 셌다는 의미이다. 따라서 반복문을 종료한다.

 

answer - cnt + 1 의 값을 화면에 출력하면 끝이다.

 

코드

Java(2022.07.11)

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

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		//N과 K 읽어오기
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		
		//N개 나라의 정보 읽어오기
		Country[] arr = new Country[n];	//저장할 배열 선언
		
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i] = new Country
					(Integer.parseInt(st.nextToken()),
					Integer.parseInt(st.nextToken()),
					Integer.parseInt(st.nextToken()),
					Integer.parseInt(st.nextToken()));
		}
		
		//메달 수 기준으로 내림차순 정렬 (많은 놈이 먼저 오도록)
		Arrays.sort(arr, new Comparator<Country>() {

			@Override
			public int compare(Country o1, Country o2) {
				// TODO Auto-generated method stub
				if(o1.gold>o2.gold) return -1;
				else if(o1.gold == o2.gold) {
					//금메달 수가 같은 경우
					if(o1.silver>o2.silver) return -1;
					else if(o1.silver == o2.silver) {
						//금, 은메달 수가 같은 경우
						if(o1.bronze>o2.bronze) return -1;
						else return 1;
					}
					else return 1;
				}
				else return 1;
			}
			
		});
		
		
		//여기부터는 동점인 국가 처리
		
		//필요한 변수들 선언
		int answer = -1;	//정답을 저장할 변수
		int g = -1;	//K나라의 금메달 수
		int s = -1;	//K나라의 은메달 수
		int b = -1;	//K나라의 동메달 수
		
		//배열을 쭉 돌며 K나라를 찾기
		for(int i=0; i<n; i++) {
			if(arr[i].num == k) {	//K나라를 찾았다면
				//answer, g, s, b의 값을 업데이트
				answer = i;
				g = arr[i].gold;
				s = arr[i].silver;
				b = arr[i].bronze;
				break;	//탐색 종료
				}
		}
		
		//이제 answer에는 정렬된 배열 상에서의 K나라의 인덱스가 저장되어있음
		
		//동점인 나라 개수 세기
		int cnt = 0;	//동점인 나라 개수를 저장할 변수
		//K나라보다 앞 순서인 국가들에 대하여, K나라의 바로 직전부터 0번째 국가까지 반복
		for(int i=answer-1; i>=0; i--) {
			if(	//K나라와 동점인 나라가 발견되면
					arr[i].gold == g
					&&
					arr[i].silver == s
					&&
					arr[i].bronze == b
					) cnt++;	//cnt 1 증가
			else break;	//동점이 아닌 나라가 발견되었다면 그보다 앞의 국가들도 모두 절대 동점이 아니므로 탐색 종료
		}
		
		//정답 출력(answer이 인덱스 값이므로 1 더하기)
		System.out.print(answer-cnt+1);
	}

}

//나라 클래스
class Country{
	//필드
	int num;	//국가번호
	int gold;	//금메달 수
	int silver;	//은메달 수
	int bronze;	//동메달 수
	
	//생성자
	public Country(int num, int gold, int silver, int bronze) {
		this.num = num;
		this.gold = gold;
		this.silver = silver;
		this.bronze = bronze;
	}
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#1935 : 후위 표기식2  (0) 2022.07.19
#15726 : 이칙연산  (0) 2022.07.13
#11945 : 뜨거운 붕어빵  (0) 2022.06.23
#1590 : 캠프가는 영식  (0) 2022.06.19
#2407 : 조합  (0) 2022.06.19