이 문제는 어제 풀어보았던 단어 정렬 문제와 비슷한 유형입니다. 바로 Comparator 혹은 Comparable을 구현해서 정렬하는 문제입니다. 그럼 여기서 의문이 생길 수 있습니다.
그냥 sort를 사용해서 정렬을 하면 되는데, 왜 저런 것을 사용하는거지??
sort는 하나의 값을 기준으로 정렬할 때 사용할 수 있지만, 객체를 정렬할 때는 사용하지 못하기 때문입니다. 즉 객체의 어떤 속성(값)을 기준으로 정렬할 지 모호하기 때문에 Comparable 혹은 Comparator를 구현해서 원하는 정렬을 진행해야 합니다. 사용법만 안다면 간단하게 구현할 수 있습니다.
Comparable 구현
Comparable은 객체가 될 클래스가 Comparable을 구현함으로써 사용 가능합니다. compareTo라는 함수를 오버라이드 해서 클래스의 객체인 Coordinates와 this의 x,y 값을 비교해서 값을 리턴하게 됩니다.
publicclassBOJ11650{ publicstaticvoidmain(String[] args)throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(bf.readLine()); List<Coordinates> list = new ArrayList<>(); for (int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(bf.readLine(), " "); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); list.add(new Coordinates(x, y)); }
Collections.sort(list);
for (int i = 0; i < list.size(); i++) bw.write(list.get(i).x + " " + list.get(i).y + "\n");
bw.flush(); bw.close(); bf.close(); } }
classCoordinatesimplementsComparable<Coordinates> { int x; int y;
Comparator 구현
Comparator를 구현하면 compare()라는 메소드를 오버라이드 합니다. 이 함수는 매개 변수로 두 개의 객체가 들어있어서 두 개의 객체를 비교하여 리턴하는 값에 따라서 정렬된 값을 알 수 있습니다. 두 객체를 비교해서 음수, 0, 양수를 반환하도록 합니다. Comparator를 구현하면 기본 정렬 외에도 다른 기준으로 정렬하고자 할 때 사용할 수 있습니다.
publicclassBOJ11650{ publicstaticvoidmain(String[] args)throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(bf.readLine()); List<Coordinates> list = new ArrayList<>(); for (int i = 0; i < N; i++) { StringTokenizer st = new StringTokenizer(bf.readLine(), " "); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); list.add(new Coordinates(x, y)); }
// Comparator를 이용한 방법 list.sort(new Comparator<Coordinates>() { @Override publicintcompare(Coordinates o1, Coordinates o2){ // o1을 기준으로 잡는다. // o2가 비교하는 객체가 된다. // 오름 차순! if (o1.x == o2.x) { if (o1.y > o2.y) { return1; } else { return -1; } }elseif(o1.x>o2.x){ return1; }elseif(o1.x<o2.x){ return -1; }else { return0; } } });
Collections.sort(list);
for (int i = 0; i < list.size(); i++) bw.write(list.get(i).x + " " + list.get(i).y + "\n");