글 작성자: 취업중인 피터팬
728x90

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

문제 설명

 

회원의 나이와 이름을 받고 나이순으로 정렬하되 나이가 같으면 가입한 순으로 정렬을 하는 문제입니다.

 

보고 오기를 추천하는 게시물

 

https://kkungchan.tistory.com/300

 

Java - comparable과 comparator에 대해

java에서 정렬을 할 때 빼고 이야기할 수 없는 객체가 Comparable과 Comparator입니다. 이 두 가지를 봤을 때 다른 점은 어렵지 않으나 java안에서 사용하고 구현하는 것이 쉽지 않고 당황스럽습니다. 저

kkungchan.tistory.com

 

문제 풀이

 

문제를 보고 처음에 든 생각은 회원을 객체로 만들어야 겠다는 생각입니다.

언제부터인가 객체지향 언어를 하고 부터는 저런 유형을 객체로 만들지 않으면 몸이 간지러운 병에 걸렸습니다.

그래서 회원 객체를 만들고 그 객체의 compareTo를 나이순으로 재정의 해주어 Arrays.sort에 넘겨 그 기준으로 정렬하도록 지정하는 방식으로 구현하도록 하겠습니다.

compareTo와 Comparator에 대해 궁금하신 분들은 위에 참고 게시글을 숙지하고 와주시면 감사하겠습니다.

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        
        //회원을 여러명 입력받을 배열
        Member[] arrMember = new Member[n];
        
        //회원을 입력받음
        for(int i=0; i<n; i++){
            int age = sc.nextInt();
            String name = sc.next();
            arrMember[i] = new Member(age,name);
        }
        
        //나이순으로 정렬
        Arrays.sort(arrMember,new Comparator<Member>(){
            @Override
            public int compare(Member m1, Member m2) {
                return m1.compareTo(m2);
            }
        });
        
        //한줄에 출력
        for(int i=0; i<n; i++){
            System.out.println(arrMember[i].age + " " + arrMember[i].name);
        }


    }
}

class Member implements Comparable<Member> {

    int age;
    String name;

    public Member(int age, String name){
        this.age = age;
        this.name = name;
    }
    
    //나이순으로 정렬을 위한 compareTo 구현
    @Override
    public int compareTo(Member o) {
        return this.age - o.age;
    }
}

가입한 회원순은 sort는 안전정렬(값이 같을 때 원소의 위치가 변경되지 않음)이 되기 때문에 굳이 구현해 주지 않아도 정렬이 됩니다.