[Java] 백준(실버-5) 10814번 - 나이순 정렬

문제 풀이
나이 순으로 정렬하면서 나이가 같은 사람일 경우 먼저 입력받은 순으로 정렬해야 한다.
여기서 주의 할 점은 나이가 같을 때 입력받은 순으로 정렬해야 한다는 점이다.
이 문제는 2차원 배열을 이용하여 정렬하는 방법과 클래스 객체를 통해 정렬하는 방법 두가지 방식으로 풀어보았다.
두 풀이 모두 Arrays.sort() 함수를 확장하여 Comparator의 compare 메소드를 구현하여 정렬하였다.
2차원 배열 활용
나이와 이름 두가지를 입력받을 때부터 2차원 배열을 활용할 수 있음을 알 수 있었다.
나이를 오름차순으로 정렬해가며 나이가 같을 경우는 compare 메소드에서 0을 반환하기 때문에 입력순서를 보장받을 수 있다.
코드를 작성해보자.
1
2
3
4
5
6
7
8
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][2];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken(); // age
arr[i][1] = st.nextToken(); // name
}
N을 입력받고 [나이, 이름]의 배열을 N개 가지는 2차원 배열 arr를 선언한다.
그리고 나이와 이름을 입력받으며 arr에 저장한다.
1
2
3
4
5
6
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
});
2차원 배열 arr를 Arrays.sort()를 확장 후 Comparator의 compare 메소드를 구현한다.
나이가 증가하는 순이니 오름차순으로 정렬해가며 나이가 같을 경우엔 자연스럽게 입력받은 순서로 정렬되게 된다.
위 코드에서 compare 메소드를 람다식으로 더 간단하게 줄일 수 있다.
1
2
3
Arrays.sort(arr, (o1, o2) -> {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
});
클래스 객체 활용
2차원 배열을 이용하는 방법 외에도 클래스 객체를 배열에 넣어 사용하여 자바스럽게 풀어보고 싶었다.
나이와 이름을 가지는 클래스를 별도로 생성하고, 이 클래스를 N개 가지는 배열을 만든 뒤 2차원 배열 정렬방법과 동일하게 나이순으로 정렬하면 된다.
그럼 먼저 클래스 객체 코드를 작성해보자.
1
2
3
4
5
6
7
8
9
public static class People {
private int age;
private String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
}
나이와 이름을 받을 클래스 객체를 만들었으니 나머지 코드를 작성하자.
1
2
3
4
5
6
7
int N = Integer.parseInt(br.readLine());
People[] peoples = new People[N];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
peoples[i] = new People(Integer.parseInt(st.nextToken()), st.nextToken());
}
N을 입력받고 people 클래스를 N개 가지는 peoples 배열을 선언한다.
그리고 나이와 이름을 입력받으며 people 클래스의 생성자를 통해 peoples 배열에 저장한다.
1
2
3
4
5
6
Arrays.sort(peoples, new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
return o1.age - o2.age;
}
});
이번에도 동일하게 compare 메소드를 구현하는데, 비교되는 두 객체의 나이를 비교하여 나이순으로 정렬할 수 있다.
또한 람다식으로 아래와 같이 코드를 줄일 수 있다.
1
2
3
Arrays.sort(peoples, (o1, o2) -> {
return o1.age - o2.age;
});
작성코드
작성코드 - 2차원 배열 활용
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
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());
String[][] arr = new String[N][2];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken(); // age
arr[i][1] = st.nextToken(); // name
}
Arrays.sort(arr, (o1, o2) -> {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
});
for(int i=0; i<arr.length; i++) {
bw.write(arr[i][0] + " " + arr[i][1] + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
작성코드 - 클래스 객체 활용
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
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());
People[] peoples = new People[N];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
peoples[i] = new People(Integer.parseInt(st.nextToken()), st.nextToken());
}
Arrays.sort(peoples, (o1, o2) -> {
return o1.age - o2.age;
});
for(People people : peoples) {
bw.write(people.age + " " + people.name + "\n");
}
bw.flush();
bw.close();
br.close();
}
public static class People {
private int age;
private String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
}
}
회고
- 2차원 배열을 정렬하기 위해 Arrays.sort() 함수를 확장하여 Comparator의 compare 메소드를 구현하며 많은 공부가 되었고, 더 다양한 정렬 알고리즘에 대해서 공부가 필요하다고 느꼈다.
- 객체지향 언어인 자바에서는 객체를 활용하여 다루는 일이 많기 때문에 클래스와 객체에 대해서 공부할 수 있었다.