3 minute read




문제 풀이


나이 순으로 정렬하면서 나이가 같은 사람일 경우 먼저 입력받은 순으로 정렬해야 한다.
여기서 주의 할 점은 나이가 같을 때 입력받은 순으로 정렬해야 한다는 점이다.

이 문제는 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 메소드를 구현하며 많은 공부가 되었고, 더 다양한 정렬 알고리즘에 대해서 공부가 필요하다고 느꼈다.
  • 객체지향 언어인 자바에서는 객체를 활용하여 다루는 일이 많기 때문에 클래스와 객체에 대해서 공부할 수 있었다.