[Java] 백준(실버-5) 7568번 - 덩치

문제 풀이
이 문제는 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차원 배열을 활용하는게 더 도움이 되었다.