설명
N개의 평면상의 좌표(x, y)가 주어지면 모든 좌표를 오름차순으로 정렬하는 프로그램을 작성하세요.
정렬기준은 먼저 x값의 의해서 정렬하고, x값이 같을 경우 y값에 의해 정렬합니다.
입력
첫째 줄에 좌표의 개수인 N(3<=N<=100,000)이 주어집니다.
두 번째 줄부터 N개의 좌표가 x, y 순으로 주어집니다. x, y값은 양수만 입력됩니다.
출력
N개의 좌표를 정렬하여 출력하세요.
예시 입력 1
5
2 7
1 3
1 2
2 5
3 6
예시 출력 1
1 2
1 3
2 5
2 7
3 6
문제 해결
x좌표를 기준으로 정렬을 하되, x좌표가 같으면 y좌표를 기준으로 정렬이 되는 문제이다.
(x,y) 2개의 열로 정해져 있고, 좌표의 총 개수는 N개로 입력 받아지므로 2차원 배열은 int[N][2] 로 만들어주면 된다.
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[][] arr = new int[N][2];
x좌표를 기준으로 정렬을 하되, x좌표가 같으면 y좌표를 기준으로 정렬이되므로 i번째의 x좌표 / i번째의 y좌표를 각각 저장하기 위해 아래와 같이 입력받아 저장해준다.
for(int i = 0; i < N; i++) {
arr[i][0] = in.nextInt(); // x
arr[i][1] = in.nextInt(); // y
}
비교를 하기 위해 구글링을 하다가 Comparator를 사용하는 방법을 사용하기로 했다.
람다 표현식 (a, b) -> {...}은 Comparator의 compare 메서드를 구현 => 두 개의 인수를 받아 비교 결과를 반환
먼저 x좌표를 기준으로 정렬을 한다고 했으므로 x좌표가 서로 다를 경우, 오름차순으로 정렬하도록 구현한다.
a[0] != b[0] ( x좌표가 서로 다를 경우) a[0] - b[0]를 반환한다.
else 아닌 경우, 즉 x좌표가 같은 경우에는 y좌표를 기준으로 정렬이 되어야 하므로 1번째 인덱스로 비교해준다.
그리고 a[1] - b[1]를 반환해준다.
이 반환된 값들은 Arrays.sort() 메서드가 Comparator를 사용하여 배열을 정렬한다.
개인적으로 좀 어려웠당... 다 까먹은 개념이라서 어렵게 다가온 거 같은데 알고 있었다면 문제 푸는데 유용했을 거 같당
최종 코드
import java.util.Arrays;
import java.util.Scanner;
public class P07_좌표정렬 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[][] arr = new int[N][2];
for(int i = 0; i < N; i++) {
arr[i][0] = in.nextInt(); // x
arr[i][1] = in.nextInt(); // y
}
Arrays.sort(arr, (a, b) -> {
if (a[0] != b[0]) {
return a[0] - b[0];
} else { // x 좌표가 같으면 y 좌표에 따라 정렬
return a[1] - b[1];
}
});
for (int i = 0; i < N; i++) {
System.out.println(arr[i][0] + " " + arr[i][1]);
}
}
}
'알고리즘 문제풀이 입문: 코딩테스트 대비 > 섹션 6. Sorting, Searching(정렬, 이분검색과 결정)' 카테고리의 다른 글
뮤직비디오 (결정 알고리즘) (0) | 2024.04.20 |
---|---|
이분검색 (0) | 2024.04.20 |
장난꾸러기 (0) | 2024.04.19 |
중복 확인 (0) | 2024.04.19 |
Least Recently Used (0) | 2024.04.19 |