[Algorithm/Java] 백준 11650번 - 좌표 정렬하기
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개다:
- x좌표 오름차순
- 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
}
// 정렬
// 결과 출력
}
}
댓글남기기