알고리즘

[java] 백준 올림픽

_DAMI 2023. 3. 24. 00:05

 

 

package main;

import java.util.*;

class medal implements Comparable<medal>{
	int num,gold,sliver,bronze,rank;
	public medal(int num,int gold,int sliver,int bronze,int rank) {
		this.num=num;
		this.gold=gold;
		this.sliver=sliver;
		this.bronze=bronze;
		this.rank=rank;
	}
	@Override
	public int compareTo(medal o) {
		if(this.gold==o.gold) {
			if(this.sliver==o.sliver) {
				return o.bronze - this.bronze ;
			}else {
			return o.sliver - this.sliver;}
		}else {
		return o.gold - this.gold;}
	}
}


public class Main {

	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
			
		int n=sc.nextInt(); //나라수
		int k=sc.nextInt(); // 알고 싶은 국가번호
		
		medal[] arr = new medal[n];
	
		for(int i=0; i<n;i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			int c=sc.nextInt();
			int d=sc.nextInt();
			arr[i] = new medal(a,b,c,d,1);
		
		}
		
		Arrays.sort(arr); //순서대로 정렬시켜준다.
		
		int cnt=1; //공통의 수세기
		for(int i=1; i<n;i++) {
			if((arr[i].gold == arr[i-1].gold)&&(arr[i].sliver == arr[i-1].sliver)&&
					(arr[i].bronze == arr[i-1].bronze)) {
				arr[i].rank= arr[i-1].rank;
				cnt++;
			}else {
				arr[i].rank= arr[i-1].rank+cnt;
				cnt=1;
			}
		}
		
		for(int i=0; i<n;i++) {
			//System.out.println(arr[i].num+ " "+ arr[i].rank);
			
			  if(arr[i].num==k) { System.out.println(arr[i].rank); }
			 
		}
	}
}

 

금,은,동에 따라 정렬해준다

금은동이 같으면 같은 등수를 매겨야 하니까 그전의 랭킹과 같은 등수를 넣고 cnt증가 (cnt는 공통인게 몇개인지 센다)

금은동이 같지 않다면 같은 등수였던 개수만큼 이전랭킹에 더해주고 cnt를 1로 초기화해줘야 다음번에도 셀 수 있음

 

 

 

@Override
	public int compareTo(medal o) {
		if(this.gold==o.gold) {
			if(this.sliver==o.sliver) {
				return o.bronze - this.bronze ;
			}else {
			return o.sliver - this.sliver;}
		}else {
		return o.gold - this.gold;}
	}

gold가 같다면 slive비교 sliver가 같다면 bronze가 많은걸로 정렬시킨다. o.bronze - this.bronze 가 양수 = 내림차순