[백준/7568번/java] - 덩치
문제에 대해서 먼저 이해를 해보자.
내가 중점을 두고 본 부분은 "만일 자신보다 더 큰 덩치의 사람이 k 명 이라면 그 사람의 덩치 등수는 k+1 이 된다" 이 부분이었다.
처음에 문제를 읽고는 x 좌표 y 좌표를 모두 비교해서 정렬을 해야하나.. 아니면 모든 좌표를 비교해야하나.. 고민을 했는데 위에 저 부분을 읽고 방향성이 잡혔다!
그래서 나온 코드는 아래와 같다.
import java.util.Scanner;
public class boj_7568 {
/**
* 1. x 좌표 비교하기
* 2. 비교하는 x 가 크면, y 비교
* 2-1. y 도 크면 자기보다 큰거임
* 2-2. y는 작다면 덩치가 같은거 -> 다음비교로 넘어가기
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[][] arr = new int[N][2];
int[] result = new int[N];
for(int i = 0; i < N; i++){
arr[i][0]=scan.nextInt();
arr[i][1]=scan.nextInt();
}
for(int j = 0; j < N; j++){
int x = arr[j][0];
int y = arr[j][1];
int cnt = 1;
for(int k = 0; k < N; k++){
if(x<arr[k][0]){
if(y<arr[k][1]){
cnt++;
}
}
}
result[j] = cnt;
}
for(int h = 0; h < N; h++){
System.out.print(result[h]+" ");
}
}
}
먼저, scanner 로 몇개를 입력받을건지 N 을 입력받고
N 개의 행을 가진 2차원 배열 arr 을 선언해준다.
그리고 출력을 해줄 N개의 인덱스를 가진 1차원 배열 result 를 선언해준다.
그리고 첫번째 for 문을 이용해서 2차원 배열에 수를 입력받아 저장해준다.
여기까지가 준비과정!
이제부터가 시작이다.
for 문으로 배열을 모두 순회할건데, 알고리즘은 다음과 같다.
먼저 x 좌표먼저 비교하고, 만약 x 좌표가 더 크다면 y 를 비교한다.
여기서 y 도 크다면 현재 배열보다 덩치가 큰 배열이므로 cnt++ 을 해준다.
다른 경우는 cnt++ 을 해줄 필요가 없다. 왜냐면 덩치가 크다고 판단하려면 x 좌표, y 좌표 모두 커야만 한다.
x 좌표는 크지만 y 좌표는 작거나 이 반대의 경우라면 그리고 x,y 모두 작다면 덩치가 더 작기 때문이다.
내가 구하려고하는 덩치는 나보다 큰 사람수 + 1 이기 때문에 난 덩치가 큰 사람의 수에만 관심이 있다.
cnt 를 구해서 해당 인덱스의 result 배열에 저장해준다.
그리고 나서 for 문을 통해 result 를 출력해주면 등수를 구할 수 있다!
끝!!