1 분 소요



https://www.acmicpc.net/problem/11650



📌 문제

문제 유형

  • 정렬


문제 설명

  • 2차원 평면 위에 있는 N개의 점을 x좌표 오름차순으로 정렬
  • x좌표가 같은 경우 y좌표 오름차순


입출력 예시

입력

5
3 4
1 1
1 -1
2 2
3 3

출력

1 -1
1 1
2 2
3 3
3 4



🔍 문제 풀이

comparingInt vs Integer.compare 차이점

백준 10814번 -나이순 정렬 문제와 구조가 비슷하지만, Comparator 사용 방식이 다르기 때문에 헷갈린다. 정리해보자.


Comparator.comparingInt(a -> a[0])는 정렬 기준이 1개일 때 사용하는 방식,

  • 배열의 각 요소 a에서 비교 기준이 되는 정수 값을 하나 추출해서 정렬 기준으로 사용하는 방식이다.
  • a는 arr 배열의 각 행 (int[])이며, a[0]은 그 행의 첫 번째 값을 의미한다.
  • 나이순 정렬 문제에서는 나이 하나만 비교하면 되므로 이 방식이 적합하다.


반면, 이 문제는 정렬 기준이 2개다:

  1. x좌표 오름차순
  2. x좌표가 같으면 y좌표 오름차순
  • 이런 경우에는 comparingInt만으로는 부족하고, 두 요소를 직접 비교해야 하므로 (a, b) -> { ... } 형식의 람다 표현식과 Integer.compare()를 함께 사용해야 한다.
  • Integer.compare(a, b)는 a와 b를 비교해서 정렬 순서를 알려준다는 의미이다.
Arrays.sort(arr, (a, b) -> {
    if (a[0] == b[0]) return Integer.compare(a[1], b[1]); // y 기준
    return Integer.compare(a[0], b[0]); // x 기준
});



💻 전체 코드

import java.io.*;
import java.util.*;

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());
        int[][] arr = new int[n][2];

        for(int i=0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            arr[i][0] =  Integer.parseInt(st.nextToken()); // x
            arr[i][1] =  Integer.parseInt(st.nextToken()); // y
        }


        // 여기가 핵심
        Arrays.sort(arr, (a, b) ->{
            if(a[0] ==  b[0]) return Integer.compare(a[1], b[1]);
            return Integer.compare(a[0], b[0]);

        });

        // StringBuilder 사용하면 더 빠름
        StringBuilder sb = new StringBuilder();

        for(int[] sorted: arr){
            sb.append(item[0]).append(" ").append(item[1]).append("\n");
        }

        System.out.println(sb);
    }
}



💭 느낀 점

  • 10814번과 유사하지만, 정렬 기준이 2개(x, y)라서 Comparator.comparingInt()를 사용할 수 없다는 점이 처음엔 헷갈렸다.
  • Integer.compare()(a, b) -> {} 형태의 람다식을 이용하면 복합 조건 정렬도 깔끔하게 구현할 수 있다는 것을 배웠다.



🔁 복습 템플릿

import java.io.*;
import java.util.*;

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());
        int[][] arr = new int[n][2];

        for(int i=0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            arr[i][0] =  Integer.parseInt(st.nextToken()); // x
            arr[i][1] =  Integer.parseInt(st.nextToken()); // y
        }


        // 정렬


        // 결과 출력


    }
}


카테고리:

업데이트:

댓글남기기