Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_좌표정렬) 본문
알고리즘/인프런 - Java알고리즘 입문
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_좌표정렬)
slow-walker 2023. 10. 2. 10:51
7. 좌표 정렬(compareTo)
x 좌표 값에 의해 오름차순 정렬하고, x값이 같으면 y값에 의해 오름차순 정렬해서 출력하면 되는 문제
예시 입력 1
5
2 7
1 3
1 2
2 5
3 6
예시 출력 1
1 2
1 3
2 5
2 7
3 6
아래 코드에 대한 설명
if(this.x==o.x) return this.y-o.y;
- 오름차순의 경우 : this - object
- 내림차순의 경우 : object - this
오름차순으로 만들고자할때 현재 메소드를 호출한 this객체가 앞에있고 매개변수로 넘어온 object객체가 뒤에 있다고 생각해라.

이 순서대로 정렬이 되려면 무조건 음수값이 리턴되도록 해야 합니다. 다시말해서 this가 앞에 있고 대상객체가 뒤에 있게 하고, 10 20 이 순서대로 있게 하려면, this에서 object를 빼줘야 합니다.
반대로 내림차순으로 만들려고 해도 음수로 만들어줘야 한다. 그때는 object에서 this를 빼줘야 합니다.

강의 풀이 (Time: 170ms Memory: 27MB)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
// 좌표 하나하나를 저장하는 클래스
class Point implements Comparable<Point> { // Point란 클래스 객체를 정렬한다
public int x, y;
// 생성자를 통해 초기화됨
Point(int x, int y) {
this.x = x;
this.y = y;
}
// 외워라! - 좌표할땐 이렇게 해라!
// 오름차순 (this가 앞에 있고, object가 뒤에 있을때 음수 리턴 : 10 20)
@Override
public int compareTo(Point o) {
if (this.x == o.x) return this.y - o.y; // 작은거에서 큰 것 빼기
// x값이 다르면 x값에 의해 정렬
else return this.x - o.x;
}
// 내림차순 (this가 앞에 있고, object가 뒤에 있을때 음수 리턴 : 20 10)
// @Override
// public int compareTo(Point o) {
// if (this.x == o.x) return o.y-this.y; // 작은거에서 큰 것 빼기
// // x값이 다르면 x값에 의해 정렬
// else return o.x-this.x;
// }
}
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
ArrayList<Point> arr = new ArrayList<>();
for (int i = 0; i < n; i++) {
int x = kb.nextInt(); // 2
int y = kb.nextInt(); // 7
arr.add(new Point(x, y)); // 포인트 클래스라는 객체 생성해서 List저장
}
// 내가 만든 정렬기준으로 정렬됨
Collections.sort(arr);
for (Point o : arr) System.out.println(o.x+ " "+o.y);
}
}
// 오름차순 출력
1 2
1 3
2 5
2 7
3 6
// 내림차순 출력
3 6
2 7
2 5
1 3
1 2
arr.add(new Point(x, y)); //이부분 출력 - Point클래스에 toString()오버라이딩
System.out.println(arr);
// 출력
[Point{x=2, y=7}]
[Point{x=2, y=7}, Point{x=1, y=3}]
[Point{x=2, y=7}, Point{x=1, y=3}, Point{x=1, y=2}]
[Point{x=2, y=7}, Point{x=1, y=3}, Point{x=1, y=2}, Point{x=2, y=5}]
[Point{x=2, y=7}, Point{x=1, y=3}, Point{x=1, y=2}, Point{x=2, y=5}, Point{x=3, y=6}]
다른 사람 풀이 1 (Time: 272ms Memory: 32MB)
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Other1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][2];
for (int i = 0; i < n; i++)
for (int j = 0; j < 2; j++)
arr[i][j] = sc.nextInt();
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
}
});
for(int i = 0; i < n; i++){
System.out.println(arr[i][0] + " "+arr[i][1]);
}
}
}
다른 사람 풀이 2 (Time: 188ms Memory: 27MB)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Other2 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
for (int i = 0; i < arr.length; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
for (int j = 0; j < arr.length; j++) {
for (int i = 0; i < arr.length; i++) {
if (arr[i][0] > arr[j][0]) {
sort(arr, i, j);
}
}
}
for (int j = 0; j < arr.length; j++) {
for (int i = 0; i < arr.length; i++) {
if (yCondition(arr, i, j)) {
sort(arr, i, j);
}
}
}
for(int i = 0; i < n; i++){
System.out.println(arr[i][0] + " "+arr[i][1]);
}
}
public static void sort(int[][] arr, int i, int j) {
int x = arr[i][0];
int y = arr[i][1];
arr[i][0] = arr[j][0];
arr[i][1] = arr[j][1];
arr[j][0] = x;
arr[j][1] = y;
}
public static boolean yCondition(int[][] arr, int i, int j) {
return arr[i][0] == arr[j][0] && arr[i][1] > arr[j][1];
}
}