사람의 덩치로 등수를 정하는 문제입니다.
덩치가 큰 사람이 순위가 높은 것인데 문제에서 정의하는 "덩치가 큰 사람"은 몸무게가 더 많고 키가 더 큰 사람을 말합니다.
즉, 몸무게나 키 중 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. 결과
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준 1269] 대칭 차집합 - JAVA (0) | 2022.06.11 |
---|---|
[백준 1018번] 체스판 다시 칠하기 - Java (0) | 2022.03.10 |
[백준 2231번] 분해합 문제 - Java (0) | 2022.01.25 |
[백준 2798번] 블랙잭 문제 - Java (0) | 2022.01.18 |