백준 - 올림픽 [8979]

노력하는 배짱이·2021년 3월 30일
0

백준 알고리즘

목록 보기
30/35
post-thumbnail

문제

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

  1. 금메달 수가 더 많은 나라
  2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
  3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.

입력

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

출력

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.

풀이

이 문제 역시 나라번호, 금, 은, 동 정보를 저장하는 객체를 만들어 Comparable를 이용하여 정렬하면 된다. 다만 유의할 점은 금, 은, 동의 갯수가 같을 시 동일한 등수를 매긴다는 점이다. 따라서 등수를 저장하는 변수를 추가해서 이용하면 된다.

ArrayList로 입력을 받아 정렬한 뒤 등수를 저장하는 부분을 구현하면 되는데, 이미 정렬되어 있는 리스트의 첫번째 요소는 등수가 1이라는 것이 자명하다. 따라서 for문을 돌릴 때 1부터 돌리면 되는데, 여기서 i의 값이 등수와 밀접한 연관이 있다는 것을 알아야 한다.

주어진 예시를 보면 1등, 2등, 2등, 4등 이렇게 등수가 정해지는데 이를 적용하기 위해 for문을 돌릴 때 동일한 매달 갯수가 아닐 때 i + 1로 값을 넣어줘야 하는 것이다. 반대로 이전 요소의 메달 갯수와 동일 할 때는 이전 요소의 순위를 그대로 넣어주면 된다.

이후 처리하고 있는 요소의 나라 번호(index)가 k와 일치하면 break를 해서 출력하면 된다.

소스

import java.util.*;

class Country implements Comparable<Country> {
	private int index;
	private int gold;
	private int silver;
	private int bronze;
	private int rank;

	public int getRank() {
		return rank;
	}

	public void setRank(int rank) {
		this.rank = rank;
	}

	public Country(int index, int gold, int silver, int bronze) {
		this.index = index;
		this.gold = gold;
		this.silver = silver;
		this.bronze = bronze;
	}

	public int getGold() {
		return gold;
	}

	public int getSilver() {
		return silver;
	}

	public int getBronze() {
		return bronze;
	}

	public int getIndex() {
		return index;
	}

	@Override
	public int compareTo(Country o) {
		if (this.gold == o.gold && this.silver == o.silver) {
			return Integer.compare(o.bronze, this.bronze);
		}

		if (this.gold == o.gold) {
			return Integer.compare(o.silver, this.silver);
		}

		return Integer.compare(o.gold, this.gold);
	}
}

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int k = sc.nextInt();

		ArrayList<Country> countries = new ArrayList<Country>();

		for (int i = 0; i < n; i++) {
			int index = sc.nextInt();
			int gold = sc.nextInt();
			int silver = sc.nextInt();
			int bronze = sc.nextInt();

			countries.add(new Country(index, gold, silver, bronze));
		}

		Collections.sort(countries);

		countries.get(0).setRank(1);

		int ans = 1;

		for (int i = 1; i < countries.size(); i++) {
			Country prev = countries.get(i - 1);

			if (prev.getGold() == countries.get(i).getGold() && prev.getSilver() == countries.get(i).getSilver()
					&& prev.getBronze() == countries.get(i).getBronze()) {
				countries.get(i).setRank(prev.getRank());
			} else {
				countries.get(i).setRank(i + 1);
			}

			if (countries.get(i).getIndex() == k) {
				ans = countries.get(i).getRank();
				break;
			}

		}

		System.out.println(ans);
	}

}

0개의 댓글