본문 바로가기

Coding Test/Step13. 정렬

[Java] 10단계. 나이순 정렬 [10814번]

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

  • 예제 입력1
3
21 Junkyu
21 Dohyun
20 Sunyoung
  • 예제 출력1
20 Sunyoung
21 Junkyu
21 Dohyun

  • 문제 접근
    • 입력
      • 회원수 N (1 ≤ N ≤ 10,000)
      • N개의 줄만큼 회원의 나이와 이름이 공백으로 가입한 순서대로 입력→ 이름 : 알파벳 대소문자
      • → 나이 : 1 ~ 200
    • 출력
      • 나이 오름 차순
      • 나이가 같을 경우 가입 순서
      • 한 줄에 한 명씩 나이와 이름을 공백으로 출력
  • 문제 해결
    • 가입한 순서로 정렬도 하기 때문에 입력 받은 순서대로 인덱스가 필요
    • 회원 클래스를 생성하여 index, age, name을 매개 변수로 가지고 Comparable을 상속 받아 정렬
  • 기존 풀이 [메모리 : 53864 KB / 시간 : 632 ms]
static class Member implements Comparable<Member>{
    int index;
    int age;
    String name;

    public Member(int index, int age, String name){
        this.index = index;
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Member m){
        if(this.age == m.age)
            return this.index - m.index;
        return this.age - m.age;
    }
}
public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

    int N = Integer.parseInt(br.readLine());
    Member[] members = new Member[N];

    for(int i = 0; i < N; i++){
        String[] input = br.readLine().split(" ");
        members[i] = new Member(i, Integer.parseInt(input[0]), input[1]);
    }

    Arrays.sort(members);

    for(Member m : members)
        sb.append(m.age).append(" ").append(m.name).append("\n");

    System.out.println(sb);
}