처음에는 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;
}
}
}