2 minute read




문제 풀이


이 문제는 N명의 키와 몸무게를 통해 덩치 순위를 구해야한다.
처음엔 HashMap으로 풀다가, 문제 요구사항을 보니
같은 키와 같은 몸무게를 가진 사람도 입력으로 받을 수 있어 같은 키를 가질 수 없는 HashMap이 아닌 2차원 배열을 활용하여 풀었다.

아이디어 도출

2차원 배열에서 N명의 키와 몸무게를 통해 덩치를 구하는 아이디어를 생각해보았다.

  • N명의 키와 몸무게를 입력받아 2차원 배열에 저장하고, 2차원 배열에서 모든 사람의 키와 몸무게를 비교한다.
  • 자기 자신보다 덩치가 큰 사람이 있다면 순위가 1씩 밀린다.


이제 코드를 작성해보자.

1
2
3
int N = Integer.parseInt(br.readLine());
int[] rank = new int[N];
int[][] arr = new int[N][2];

먼저 N을 입력받고, N명의 순위를 저장할 rank 배열과 N명의 키와 몸무게를 저장할 2차원 배열 arr를 선언하자.

1
2
3
4
5
for(int i=0; i<N; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine());
    arr[i][0] = Integer.parseInt(st.nextToken());
    arr[i][1] = Integer.parseInt(st.nextToken());
}

그리고 N번만큼 받복하며 각 N명들의 키와 몸무게를 입력받아 arr에 저장한다.

1
2
3
4
5
6
7
8
9
10
for(int i=0; i<arr.length; i++) {
    int winCnt = 0;
    rank[i] = 1;
    for(int j=0; j<arr.length; j++) {
        if(i != j) {
            if((arr[i][0]<arr[j][0]) && (arr[i][1]<arr[j][1])) winCnt++;
        }   
    }
    rank[i] += winCnt;
}

2차원 배열에 N명의 키와 몸무게를 모두 담았으니, 이제 덩치에 따른 순위를 구하면 된다.
순위를 1로 초기화 한 후 이중 for문을 돌며 모든 사람들과 덩치를 비교하여 더 큰 덩치를 가진 사람이 있다면 자기 자신의 순위를 1씩 증가시킨다.

1
2
3
4
5
StringBuilder sb = new StringBuilder();
for(int user : rank) {
    sb.append(user + " ");
}
bw.write(sb.toString()+"\n");

마지막으로 N명의 순위를 공백 기준으로 한 줄에 출력해야 하기에 StringBuilder에 담아 출력하도록 하였다.



작성코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        int[] rank = new int[N];
        int[][] arr = new int[N][2];

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

        for(int i=0; i<arr.length; i++) {
            int winCnt = 0;
            rank[i] = 1;
            for(int j=0; j<arr.length; j++) {
                if(i != j) {
                    if((arr[i][0]<arr[j][0]) && (arr[i][1]<arr[j][1])) winCnt++;
                }   
            }
            rank[i] += winCnt;
        }

        StringBuilder sb = new StringBuilder();
        for(int user : rank) {
            sb.append(user + " ");
        }
        bw.write(sb.toString()+"\n");

        bw.flush();
        bw.close();
        br.close();
    }   
}

회고

  • 처음엔 HashMap을 활용하여 접근했으나, HashMap의 중복 허용이 안되는 점을 다시 한번 깨닫고, 2차원 배열을 활용하여 문제를 풀었다.
  • 문제를 단순하게 풀기에 2차원 배열을 활용하는게 더 도움이 되었다.