[TIL] 백준 10814 나이순 정렬

·2023년 3월 29일
0

알고리즘

목록 보기
3/11
post-thumbnail

문제

해결방법

처음에는 depue로 해결을 할 수 있을거라 생각했는데, 처음과 끝뿐만 아니라 중간에 도 값을 낑겨 넣어야 한다는 것을 깨닫고는 멘붕에 빠졌다.

또한, 숫자인 age와 문자열인 name을 어떻게 구분하여 정렬해야 하는지 전혀 감이 잡히지 않았다.

그러다 배열은 기본형 타입뿐만 아니라 참조형 타입도 만들 수 있지 않나? 하고 Person이라는 클래스를 만들어 객체를 저장할 수 있도록 하였다.

public static class Person {
        int age;
        String name;

        Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    }

입력 값을 저장할 수 있는 클래스를 생성했으니 반복문을 돌려 값들을 배열에 저장하였다.

Person[] person = new Person[n];

        for(int i = 0; i<n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            person[i] = new Person(Integer.parseInt(st.nextToken()), st.nextToken());
        }

현재 배열을 입력 순서대로 정렬된 상태이므로 age만 비교해 순서를 바꿔주면 된다. 단순하게 Arrays.sort(person)만 사용하면

위와 같은 오류를 만날 수 있다. 해당 오류는 생성된 Person클래스가 Comparable 인터페이스를 구현하지 않았기 때문에 나타난다.

🧐 Comparable 인터페이스는 객체를 정렬하거나 이진 검색 등에 사용되는 인터페이스이며, Arrays.sort() 메서드와 같은 정렬 메서드에서 사용된다.

이런 오류를 해결하기 위해서 아래와 같이 코드를 작성해야 한다.

Arrays.sort(person, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.age == o2.age) {
                    return 0;
                } else {
                    return o1.age - o2.age;
                }
            }
        });

Person 객체의 age들을 비교한다. 같을 경우에는 이미 입력된 순서대로 정렬된 상태이기 때문에 순서를 변경하지 않기 위해 return 0을 하고, 같지 않을 경우 두 값의 차를 이용하여 순서를 변경한다.

코드

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        Person[] person = new Person[n];

        for(int i = 0; i<n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            person[i] = new Person(Integer.parseInt(st.nextToken()), st.nextToken());
        }

        // 정렬
        Arrays.sort(person, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.age == o2.age) {
                    return 0;
                } else {
                    return o1.age - o2.age;
                }
            }
        });
        StringBuilder sb = new StringBuilder();

        for(int j = 0; j < person.length; j++) {
            sb.append(person[j].age).append(" ").append(person[j].name).append("\n");
        }

        System.out.println(sb);
    }
    public static class Person {
        int age;
        String name;

        Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    }
}
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글