백준_8979_올림픽

임정민·2023년 1월 30일
3

알고리즘 문제풀이

목록 보기
29/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

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

[나의 풀이]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {

        // N, K 입력 받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

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

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        // 국가,금,은,동 입력 받기
        HashMap<Integer, int []> map1 = new HashMap<>();

        for (int i = 1; i < N + 1; i++) {
            st = new StringTokenizer(br.readLine());

            int country = Integer.parseInt(st.nextToken());
            int [] medals = new int [3];

            for (int j = 0; j < 3; j++) {
                medals[j] = Integer.parseInt(st.nextToken());
            }
            map1.put(country,medals);
        }
	
    	// 등수 구하기
        int rank = 1;
        for(int i=1;i<N+1;i++){
            if(map1.get(K)[0]<map1.get(i)[0]){
                rank++;
            }
        }

        for(int i=1;i<N+1;i++){
            if(map1.get(K)[0]==map1.get(i)[0]&&map1.get(K)[1]<map1.get(i)[1]){
                rank++;
            }
        }

        for(int i=1;i<N+1;i++){
            if(map1.get(K)[0]==map1.get(i)[0]&&map1.get(K)[1]==map1.get(i)[1]&&map1.get(K)[2]<map1.get(i)[2]){
                rank++;
            }
        }

        System.out.println(rank);

    }

}

여러 번의 시행착오를 거친 문제입니다.

제 나름 참신하게 푼다고 금,은,동 메달들을 String으로 받아 등수를 매겼었는데

ex)
2 2
1 1 10 0
2 2 0 0

위와 같이 은메달이 10개이상일때

1번 국가: 1100
2번 국가: 200

으로 1번국가가 1등이 되어버리는 바보같은 코드를 짜고 말았습니다.🙀🙀🙀

// 오답!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {

        // 입력 받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

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

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        HashMap<Integer, Integer> map1 = new HashMap<>();

        for (int i = 1; i < N + 1; i++) {
            st = new StringTokenizer(br.readLine());

            // 국가 번호 받기
            int country = Integer.parseInt(st.nextToken());

            String medals = "";
            for (int j = 0; j < 3; j++) {
                // 국가별 금,은,동 입력 받기
                sb.append(st.nextToken());
            }
            medals = sb.toString();
            sb.setLength(0);
            map1.put(country, Integer.parseInt(medals));
        }

        // 메달별 정렬
        ArrayList<Integer> medals_info = new ArrayList<>();
        for (int value : map1.values()) {
            medals_info.add(value);
        }

        Collections.sort(medals_info, Collections.reverseOrder());
        
        // 메달 정렬과 대응되는 등수
        int[] ranking = new int[N];

        int rank = 2;
        ranking[0] = 1;
        for (int i = 0; i < medals_info.size(); i++) {
            if (medals_info.get(i).equals(map1.get(K))) {
                System.out.println(ranking[medals_info.indexOf(map1.get(K))]);
                break;
            }
            if (!medals_info.get(i).equals(medals_info.get(i + 1))) {
                ranking[i + 1] = rank++;
            } else {
                ranking[i + 1] = ranking[i];
                rank++;
            }
        }
    }
}

잘못된 아이디어로 코드를 전부 뜯어고치는 고생을 하며 개발자들이 말하는 '일단 키보드에서 손떼세요!' 라는게 어떤 의미인지 알게 되는 문제였습니다. 앞으로는 더욱 신중하게 풀어보겠습니다.

감사합니다!😹😹😹

profile
https://github.com/min731

1개의 댓글

comment-user-thumbnail
2023년 1월 30일

👍

답글 달기