한 걸음 두 걸음

백준 11650 좌표 정렬하기 JAVA로 풀기 본문

CSE/baekjoon & swexpert

백준 11650 좌표 정렬하기 JAVA로 풀기

언제나 변함없이 2020. 1. 19. 21:52
반응형

좌표 정렬하기

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.


문제해석

N개의 (x, y)값을 받고 이를 x좌표 값이 작은 순으로 정렬시키는 문제.
(만약 같은 x좌표를 가졌다면, y값이 작은 순으로 정렬시킨다.)
예)
입력 : (3, 4) (1, 1) (1, -1) (2, 2) (3, 3)
출력 : (1, -1) (1, 1) (2, 2) (3, 3) (3, 4)

답안 소스코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        XY xys[] = new XY[N];

        for (int i = 0; i < N; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            xys[i] = new XY(x, y);
        }

        Arrays.sort(xys);
        for (int i = 0; i < N; i++) {
            System.out.println(xys[i].getX() + " " + xys[i].getY());
        }
    }
}

class XY implements Comparable {
    private int x;
    private int y;

    XY(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    @Override
    public int compareTo(Object o) {
        XY mXY = (XY) o;

        if (mXY.x > x)
            return -1;
        else if (mXY.x < x)
            return 1;
        else if (mXY.x == x) {
            if (mXY.y > y)
                return -1;
            else if (mXY.y < y) {
                return 1;
            } else
                return 0;
        }
        return 0;
    }
}

JAVA에서 정렬할 때 지원하는 Comparable를 활용하여 풀었다.

class XY implements Comparable {
    private int x;
    private int y;

    XY(int x, int y) {
        this.x = x;
        this.y = y;
    }

x, y값을 받는 class XY를 만들고

 XY xys[] = new XY[N];

        for (int i = 0; i < N; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            xys[i] = new XY(x, y);
        }

객체 인스턴스를 배열로 N개만큼 만들었다.

   @Override
    public int compareTo(Object o) {
        XY mXY = (XY) o;

        if (mXY.x > x)
            return -1;
        else if (mXY.x < x)
            return 1;
        else if (mXY.x == x) {
            if (mXY.y > y)
                return -1;
            else if (mXY.y < y) {
                return 1;
            } else
                return 0;
        }
        return 0;
    }

정렬을 시키기 위해 내가 만든 XY클래스에 Comparable인터페이스를 implements시키고 정렬 기준을 x, x값이 같다면 y로 두었다.그러면

Arrays.sort(xys);

이를 통해 정렬된다.

이에 대한 자세한 내용은 https://onepinetwopine.tistory.com/487 포스팅으로 이론적 부분을 정리해두었다.

반응형