
제출코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int repeat = Integer.parseInt(br.readLine());
String[][] array = new String[repeat][3];
for (int i = 0; i < repeat; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
array[i][0] = st.nextToken(" ");
array[i][1] = st.nextToken();
array[i][2] = String.valueOf(i);
}
Arrays.sort(array, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
// 나이가 같다면 신청 순서에 따라 정렬
if (Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]) == 0) {
return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]);
} else {
// 나이를 정수로 변환하여 비교
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
}
});
StringBuilder sb = new StringBuilder();
for (String[] s : array) {
// String[] 두번째 까지만
for (int i = 0; i < 2; i++) {
sb.append(s[i]).append(" ");
}
sb.append("\n");
}
System.out.println(sb.toString());
}
}

- 2차원 배열(행렬)을 사용하여 풀어보았다. 원래는 HashMap을 사용하려 했는데 map은 인덱스도 없고, 정렬이 불가능하다는 사실을 알게되어 2차원 배열을 사용했다.
- 순서가 곧 i이기 때문에 array[i][3]에다가 순서를 넣었다.
모범답안
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[] p = new Person[N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
p[i] = new Person(age, name);
}
// 타입을 Person 으로 둘 것.
Arrays.sort(p, new Comparator<Person>() {
// 나이순으로 정렬
@Override
public int compare(Person s1, Person s2) {
return s1.age - s2.age;
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
// 객체배열의 객체를 출력하면 해당 인덱스의 객체의 toString() 이 출력 됨
sb.append(p[i]);
}
System.out.println(sb);
}
public static class Person {
int age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return age + " " + name + "\n";
}
}
}
- 클래스 Person을 만들고, 필드를 age, name을 선언하였다.
- 또한 입력값을 받음과 동시에 생성자에 넣어 인스턴스를 만든 다음, Customer[] 배열에 삽입하였다.
- Arrays.sort(p, new Comparator() 구문에서 <> 안에 있는 Person은 Comparator 인터페이스가 Person 타입의 객체들을 비교하기 위해 사용됨을 의미한다.
- 나이가 동일한 경우 사용자 입력순서에 따라 정렬하도록 하는 로직은 코드에 명시적으로 구현되어 있지 않다.
그러나 Java의 Arrays.sort() 메소드는 안정 정렬(stable sort)을 보장한다.
안정 정렬은 동일한 값을 가진 요소들의 상대적인 순서가 정렬 전과 정렬 후에 동일하게 유지됨을 의미한다.
따라서, 이 코드에서 Person 객체의 나이가 같을 경우, 그들은 자동적으로 입력받은 순서대로 유지되게 된다. 따라서 Comparator에서 나이를 비교하는 로직(return s1.age - s2.age;) 외에 추가적인 조건을 구현하지 않아도 자연스럽게 달성된다.