본문 바로가기

알고리즘/BAEKJOON

[백준 7568번] 덩치 문제 -Java

 

사람의 덩치로 등수를 정하는 문제입니다.

덩치가 큰 사람이 순위가 높은 것인데 문제에서 정의하는 "덩치가 큰 사람"은 몸무게가 더 많고 키가 더 큰 사람을 말합니다.

즉, 몸무게나 키 중 1개라도 작은 수치를 가진다면 덩치가 크다고 할 수 없습니다.

 

덩치를 비교한 결과는 아래의 3개로 나타납니다.

 

A) 몸무게와 키 모두 크다.

B) 몸무게와 키 어느 하나가 크지 않다.

C) 몸무게와 키 모두 작다.

 

순위가 높아지는 결과는 A)이고, 그렇지 않은 경우는 B)와 C)입니다.

따라서 모두의 순위가 1순위로 가정하고 A)의 경우가 아니면 순위를 하락시키는 방법을 생각했습니다.

 

1. 알고리즘

몸무게, 키 데이터 및 덩치를 비교하는 메소드를 관리하고자 'Pair'라는 class를 정의했습니다.

 

// 몸무게 및 키를 관리하는 class
class Pair {
    private int weight;
    private int heigth;
    
    public Pair(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }
    
    public boolean moreSmaller(final Pair o) {
        if(weight < o.weight && height < o.height)	// 덩치가 분명하게 작다면
            return true;
        return false;
    }
}

 

2명 이상의 데이터를 취급하므로 1차원 Pair 배열을 만들어서 데이터를 저장합니다.

 

Pair[] pairs = new Pair[N];

for(int i = 0; i < N; i++) {
    pairs[i] = new Pair(sc.nextInt(), sc.nextInt());
}

 

등수는 모두 1로 취급해서 비교한다고 했습니다.

덩치를 비교했을 때, 본인의 덩치가 다른 사람의 덩치보다 작다면 등수가 감소하는 방식입니다.

이때 본인의 정보는 비교하지 않습니다.

 

for(int i = 0; i < N; i++) {
    int rank = 1;                               // 등수는 1부터 시작

    for(int j = 0; j < N; j++) {
        if(i == j) 
            continue;                       	// 본인의 정보는 비교 안 함
        if(pairs[i].moreSmaller(pairs[j]))      // i가 j보다 덩치가 작으면 등수 하락
            rank++;
    }
    System.out.println(rank + " ");
}

 

비교적 쉽게 알고리즘을 구현할 수 있습니다.

전체 소스코드는 아래와 같습니다.

 

import java.util.*;

public class whosBigger_7568 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Pair[] pairs = new Pair[N];

        for(int i = 0; i < N; i++)
            pairs[i] = new Pair(sc.nextInt(), sc.nextInt());    // 몸무게, 키 입력

        for(int i = 0; i < N; i++) {
            int rank = 1;                                       // 등수는 1부터 시작

            for(int j = 0; j < N; j++) {
                if(i == j) 
                    continue;                                   // 본인의 정보는 비교 안 함
                if(pairs[i].moreSmaller(pairs[j]))              // i가 j보다 덩치가 작으면 등수 하락
                    rank++;
            }
            System.out.print(rank + " ");
        }
    }
}

// 몸무게 및 키를 관리하는 class
class Pair {
    private int weight;
    private int height;

    public Pair(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }
    public boolean moreSmaller(final Pair o) {
        if(weight < o.weight && height < o.height)              // 덩치가 작다면
            return true;
        return false;
    }
}

 

2. 결과