백준 11650번 좌표정렬하기(Java)

이번 문제를 통해 자바 기본기를 확실히 가져야겠다는 생각이 들었다. 정확히 어떤 메소드가 어떤 역할을 하고 어떤것을 리턴하는지 등등.. 이 문제는 x값을 기준으로 정렬을 하되, x값이 동일하면 y값 순서대로 오름차순으로 정렬하는 문제다. 

 

처음에는 x와 y를 변수로 가지고있는 class를 만들어서 정렬을 했다. 그럴경우 정렬 알고리즘을 통해 정렬을 했어야 했는데, 퀵, 힙정렬등을 적용시켜봤지만, 전부다 시간초과가 떴다. 따라서 다른 정렬방법이 필요했는데, Comparator를 사용해서 정렬을 했다. Comparator은 sort에서 정렬을 할때 사용하는데, 어떤식으로 정렬을 할지 사용한다. Comparator은 두개의 객체를 받고, 정수를 리턴한다. 리턴값이 음수,0일경우에는 두개를 바꾸지 않고, 양수일경우 두개를 바꾼다. 이를 이용하면 비교할  x가 값이 다를때는 x의 값을 빼서, 음수가 나오면 바꾸지 않고, 양수가 나오면 좌표를 바꾼다. 또 x값이 같으면 y의 값을 빼 바꾸면 된다. 

 

Stranger's Lab님의 풀이를 보고 푼 문제다.

https://st-lab.tistory.com/110#comment12697000

 

[백준] 11650번 : 좌표 정렬하기 - JAVA [자바]

www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000)..

st-lab.tistory.com

 

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

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int N = scanner.nextInt();

        int[][] arr = new int[N][2];

        for(int i = 0; i < N; i++) {
            arr[i][0] = scanner.nextInt();
            arr[i][1] = scanner.nextInt();
        }


        Arrays.sort(arr, (x1, x2) -> {
            if(x1[0] == x2[0]) {
                return x1[1] - x2[1];
            } else {
                return x1[0] - x2[0];
            }
        });

        for(int i = 0; i < N; i++) {
            System.out.println(arr[i][0] + " " + arr[i][1]);
        }
    }
}

'Algorithm > 백준' 카테고리의 다른 글

백준 1181번: 단어정렬(Java)  (0) 2021.05.08
백준 11651번 좌표정렬하기2  (0) 2021.05.07
백준 1427번 소트인사이드(Java)  (0) 2021.04.07
백준 2108번 통계학(Java)  (0) 2021.04.03
백준 2750번: 수 정렬하기  (0) 2021.03.29