PS/백준

[백준/7568번/java] - 덩치

정코딩딩 2024. 3. 22. 22:43

 

문제에 대해서 먼저 이해를 해보자.

내가 중점을 두고 본 부분은 "만일 자신보다 더 큰 덩치의 사람이 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 를 출력해주면 등수를 구할 수 있다!

끝!!