코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

8979번 : 올림픽 2

2023. 10. 3. 17:24

https://www.acmicpc.net/problem/8979

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net

 

문제

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

  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의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다. 

 


소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int arr[][] = new int[n][4];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken()); // 나라
            arr[i][1] = Integer.parseInt(st.nextToken()); // 금
            arr[i][2] = Integer.parseInt(st.nextToken()); // 은
            arr[i][3] = Integer.parseInt(st.nextToken()); // 동
        }

        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1] < o2[1]) return 1;
                else if(o1[1] > o2[1]) return -1;
                else if (o1[2] < o2[2]) return 1;
                else if (o1[2] > o2[2]) return -1;
                else if (o1[3] < o2[3]) return 1;
                else if (o1[3] > o2[3]) return -1;
                else return 0;
            }
        });

        int gold = -1, silver = -1, bronze = -1;
        for (int i = 0; i < n; i++) {
            if(arr[i][0] == k) {
                gold = arr[i][1];
                silver = arr[i][2];
                bronze = arr[i][3];
                break;
            }
        }

        int result = 1;
        for (int i = 0; i < n; i++) {
            if(arr[i][1] != gold || arr[i][2] != silver || arr[i][3] != bronze) {
                result += 1;
            } else break;
        }

        System.out.println(result);
    }
}

 

해결방법

  1. 메달 순위 규칙대로 순위가 높은 순으로 나라들을 정렬한다.
  2. 국가 K의 금, 은, 동 개수를 변수에 저장한다.
  3. 나라들을 탐색하며 메달의 수가 다르면 결과값을 1씩 증가시킨다.
  4. 메달의 수가 같다면 탐색을 중단한다.

 

'알고리즘 > 백준' 카테고리의 다른 글

14716번 : 현수막  (1) 2023.10.09
1941번 : 소문난 칠공주  (0) 2023.10.04
2792번 : 보석 상자  (0) 2023.10.01
14562번 : 태권왕  (0) 2023.09.28
9489번 : 사촌  (0) 2023.09.27
    '알고리즘/백준' 카테고리의 다른 글
    • 14716번 : 현수막
    • 1941번 : 소문난 칠공주
    • 2792번 : 보석 상자
    • 14562번 : 태권왕
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바