Algorithm
[BOJ] 백준 11650번 - 좌표 정렬하기
haehyun
2021. 11. 26. 01:34
728x90
문제
https://www.acmicpc.net/problem/11650
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net
✔ Key Point
- 2차원 배열 정렬
풀이
- 한 점의 x좌표, y좌표를 하나로 묶어 1차원 배열로, 이러한 점들을 2차원 배열로 저장
- 아래 [예제 입력 1] 의 좌표 값들을 2차원 배열로 저장하면 { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} }
5 3 4 1 1 1 -1 2 2 3 3
- 각 점을 x좌표를 기준으로 오름차순 정렬, x좌표가 같을 경우 y좌표를 기준으로 오름차순 정렬
- 배열을 정렬하는 Arrays.sort() 메서드 호출 시 비교 기준 Comparator를 정해준다.
1차원 배열 정렬
- Arrays.sort() 메서드를 사용해 배열 요소를 오름차순으로 정렬
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] pos = { 3, 1, 1, 2, 3 };
Arrays.sort(pos);
System.out.println(Arrays.toString(pos));
}
}
[1, 1, 2, 3, 3]
2차원 배열 정렬
- x좌표를 기준으로 오름차순 정렬
- Comparator.comparingInt() 메서드를 사용해 비교 기준 요소를 지정
(x좌표 = 2차원 배열의 각 요소인 1차원 배열에서 첫번째 값)
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[][] pos = { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} };
Arrays.sort(pos, Comparator.comparingInt(o1 -> o1[0]));
for(int[] arr : pos) {
System.out.println(Arrays.toString(arr));
}
}
}
[1, 1]
[1, -1]
[2, 2]
[3, 4]
[3, 3]
- x좌표 기준으로 오름차순 정렬, x좌표가 같을 경우 y좌표로 오름차순 정렬
- 람다식을 사용해 Comparator를 직접 정의
o1, o2 = 정렬 대상인 2차원 배열 pos의 각 요소 = x, y좌표를 저장하고 있는 각 1차원 배열
두 1차원 배열에서 x좌표끼리, y좌표끼리 차례로 대소 비교 수행
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] pos = { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} };
Arrays.sort(pos, (o1, o2) -> {
if(o1[0] == o2[0])
return Integer.compare(o1[1], o2[1]);
else
return Integer.compare(o1[0], o2[1]);
});
for(int[] arr : pos) {
System.out.println(Arrays.toString(arr));
}
}
}
[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);
StringBuffer sb = new StringBuffer();
int N = sc.nextInt();
int[][] pos = new int[N][2]; //좌표 배열
for(int i = 0; i < N; i++) {
pos[i][0] = sc.nextInt(); //x좌표
pos[i][1] = sc.nextInt(); //y좌표
}
//int[][] 의 비교대상인 요소 o1, o2는 각각 int[] 타입
Arrays.sort(pos, (o1, o2) ->{
if(o1[0] == o2[0])
return Integer.compare(o1[1], o2[1]);
else
return Integer.compare(o1[0], o2[0]);
});
for(int[] arr : pos) {
sb.append(String.format("%d %d\n", arr[0], arr[1]));
}
System.out.println(sb);
}
}
728x90