본문 바로가기
JAVA

[JAVA][백준] 7568_덩치

by saemsaem 2024. 4. 22.


1. Scanner 사용

import java.util.Scanner;

public class size_7568 {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[][] arr = new int[2][n];
        int[] raking = new int[n];

        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            arr[0][i] = x;
            arr[1][i] = y;
        }

        for(int j = 0; j < n; j++) {
            int k = 0;
            int maxX = arr[0][j];
            int maxY = arr[1][j];

            for (int a = 0; a < n; a++) {
                if (arr[0][a] > maxX && arr[1][a] > maxY) {
                    k++;
                }
            }

            raking[j] = k+1;
        }

        for (int s = 0; s < n; s++) {
            System.out.print(raking[s] + " ");
        }

    }
}

등수는 k+1로 출력할 수 있다. 
k는 나보다 덩치가 큰 사람의 수라고 표현할 수 있다. 

현재 비교할 사람보다 몸무게와 키가 모두 큰 사람이 있을 경우에만 k를 더해주면 된다. 
나머지 경우는 고려할 필요가 없었다. 

2개의 행을 가지는 2차원 배열을 선언한 후, arr [행][열]
x, y를 입력받고 배열에 넣어준다. 

이후 for문을 통해 덩치를 비교하는데, 
해당 사람의 몸무게와 키를 max로 정해두고, 이보다 큰 사람이 있을 경우 k를 증가시켰다. 

그리고 int 배열에 결과값을 저장하여 출력했다. 


2. BufferedReader 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class size_7568 {
    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        int[][] arr = new int[2][n];
        int[] raking = new int[n];

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            arr[0][i] = x;
            arr[1][i] = y;
        }

        for(int j = 0; j < n; j++) {
            int k = 0;
            int maxX = arr[0][j];
            int maxY = arr[1][j];

            for (int a = 0; a < n; a++) {
                if (arr[0][a] > maxX && arr[1][a] > maxY) {
                    k++;
                }
            }

            raking[j] = k+1;
            sb.append(raking[j]).append(" ");
        }
        System.out.println(sb);
    }
}

실행 시간을 줄이기 위해 BufferedReader도 사용해봤다. 
확실히 시간이 반으로 줄은 것을 확인할 수 있었다. 

BufferedReader를 사용하기 위해서는 StringTokenizer도 필요했다. 

split 사용이 적절하지 않은 이유 : spilt은 배열에 담아 반환하기 때문에, StringTokenizer보다 느리다. 데이터의 양이 적을 때는 StringTokenizer 사용이 적절하다.

한 줄에 두 개의 값이 있고, 그 값을 분리해내야 하기 때문에, 
nextToken()을 사용하여 공백을 기준으로 값을 분리한 후 첫번째 토큰은 x, 두번째 토큰은 y에 넣어줬다. 

덩치를 비교하는 것은 위와 같고,
이후 StringBuiler를 사용하여 결과를 한 줄로 출력했다.