
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
해당 문제는 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람 순으로 출력하라고 되어있다. 따라서 나이와 이름을 저장하는 클래스를 선언할 때 가입한 정보도 포함시켜 줘야 한다.
필자는 day라는 멤버변수를 만들어서 넣어주었고 day 에 따른 compareTo()를 구현하였다.
입력을 받으면서 day의 초기값은 1로 설정하고 ArrayList에 넣을 때마다 day +1를 해주면서 넣어주어 가입한 순서를 알 수 있도록 하였다.
최종적으로 Collections.sort()를 하여 정렬한 뒤 출력하면 된다.
import java.util.*;
class Person implements Comparable<Person> {
private int day;
private int age;
private String name;
public Person(int day, int age, String name) {
this.day = day;
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public int compareTo(Person o) {
if (this.age == o.age) {
return Integer.compare(this.day, o.day);
}
return Integer.compare(this.age, o.age);
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Person> persons = new ArrayList<Person>();
int day = 1;
for (int i = 0; i < n; i++) {
int age = sc.nextInt();
String name = sc.next();
persons.add(new Person(day++, age, name));
}
Collections.sort(persons);
for (Person p : persons) {
System.out.println(p.getAge() + " " + p.getName());
}
}
}