구현 - BOJ8979 올림픽

LEE ·2023년 8월 10일
0

알고리즘 기출문제

목록 보기
60/60


구현코드 :


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.Scanner;
import java.util.StringTokenizer;

class Node implements Comparable<Node>{

    private int gold;
    private int silver;
    private int bronze;
    private int rank;
    private int num;



    public Node(int gold, int silver, int bronze, int num) {
        this.gold = gold;
        this.silver = silver;
        this.bronze = bronze;
        this.num = num;
    }

    @Override
    public int compareTo(Node o){

        if(this.getGold() == o.getGold()){

            if(this.getSilver() == o.getSilver()){
                return o.getBronze() - this.getBronze();
            }
            return o.getSilver() - this.getSilver();
        }

        return o.getGold() - this.getGold();
    }

    public int getGold() {
        return gold;
    }

    public int getSilver() {
        return silver;
    }

    public int getBronze() {
        return bronze;
    }

    public int getRank() {
        return rank;
    }
    public void setRank(int rank) {
        this.rank = rank;
    }
    public int getNum() {
        return num;
    }



}

public class BOJ8979{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int cnt = Integer.parseInt(st.nextToken());
        int target = Integer.parseInt(st.nextToken());
        ArrayList<Node> list = new ArrayList<>();

        for (int i = 0; i < cnt; i++) {
            st = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(st.nextToken());
            int gold = Integer.parseInt(st.nextToken());
            int silver = Integer.parseInt(st.nextToken());
            int bronze = Integer.parseInt(st.nextToken());

            Node node = new Node(gold, silver, bronze, num);
            list.add(node);

        }
        Collections.sort(list);

        int rank = 1;
        list.get(0).setRank(rank);
        if (list.get(0).getNum() == target) {
            System.out.println(1);
            return;
        }
        for(int i = 1; i < cnt ; i++){
            int gold1 = list.get(i-1).getGold();
            int gold2 = list.get(i).getGold();
            int silver1 = list.get(i-1).getSilver();
            int silver2 = list.get(i).getSilver();
            int bronze1 = list.get(i-1).getBronze();
            int bronze2 = list.get(i).getBronze();
            if((gold1 == gold2) && (silver1 == silver2) &&(bronze1 == bronze2)){
                list.get(i).setRank(list.get(i-1).getRank());
            }else{
                list.get(i).setRank(i+1);
            }
            if(list.get(i).getNum() == target){
                System.out.println(list.get(i).getRank());
                break;
            }
        }
    }
}

코드 풀이

이 문제는 클래스 값을 정렬할 수 있는지 확인하는 문제이다. 즉 Comparable 혹은 Comparator 을 사용할 수 있는지 확인하는 문제였던거 같다.
두개 다 인터페이스 이기 때문에 Comparable 은 compareTo 메서드를, Comparator는 compare 메서드를 구현해야한다.
Comparable : 자기 자신과 비교한다는 특징이있고,
Comparator : 매개변수를 두개로 가지고 있어 자기자신이 아닌 전달받은 매개변수 두개를 비교한다는 특징이있다.
그래서 Comparator는 보통 익명 클래스를 사용한다.

Node 클래스를 보면 변수로

	private int gold;
    private int silver;
    private int bronze;
    private int rank;
    private int num;

를 선언 해둔 것을 볼수있다. 실무에서는 변수에 직접접근을 잘 하지 않고 setter 도 잘 사용하지않고 생성자 방식으로 사용한다.
rank 변수는 처음 생성할 때 값이 들어가지 않기 때문에 setter 로 값을 변경 할 수 있도록 하였지만
changeRank 와 같은 이름으로 메서드를 만들어서 사용하는 편이 더 좋은 것같다.

0개의 댓글

관련 채용 정보