https://www.acmicpc.net/problem/11650
이 문제는 예전에 병합 정렬로 푼 적이 있다.
그러나 11651번을 풀때 시간초과가 나서 람다식을 이용한 방식을 다시 배웠다.
학원에서 람다식을 막 다시 배웠기도 하고 연습 하는 겸 해보았다.
이 풀이에서는 Comparator 클래스를 가져와 compare 메소드를 오버라이딩 하여 사용하는데 여기서 제네릭 타입 개념도 다시 상기시킬 수 있었다.
기존 병합 정렬을 이용한 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int tmp[][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// n: 입력할 좌표 갯수
int n = Integer.parseInt(br.readLine());
// 좌표 저장 2차원 배열
int[][] arr = new int[n][2];
tmp = new int[n][2];
// 좌표 입력
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
// 정렬
mergeSort(arr, 0, n - 1);
// 출력
for (int i = 0; i < n; i++) {
System.out.println(arr[i][0] + " " + arr[i][1]);
}
}
private static void mergeSort(int[][] arr, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
private static void merge(int[][] arr, int start, int mid, int end) {
int part1 = start;
int part2 = mid + 1;
int index = start;
while (part1 <= mid && part2 <= end) {
if (arr[part1][0] < arr[part2][0]) {
tmp[index][0] = arr[part1][0];
tmp[index][1] = arr[part1][1];
part1++;
} else if (arr[part1][0] > arr[part2][0]) {
tmp[index][0] = arr[part2][0];
tmp[index][1] = arr[part2][1];
part2++;
} else {
// x좌표가 같을 경우 처리
if (arr[part1][1] < arr[part2][1]) {
tmp[index][0] = arr[part1][0];
tmp[index][1] = arr[part1][1];
part1++;
} else {
tmp[index][0] = arr[part2][0];
tmp[index][1] = arr[part2][1];
part2++;
}
}
index++;
}
if(part1>mid) {
for(int t=part2;t<=end;t++) {
tmp[index][0]= arr[t][0];
tmp[index][1]= arr[t][1];
index++;
}
}
else {
for(int t=part1;t<=mid;t++) {
tmp[index][0]= arr[t][0];
tmp[index][1]= arr[t][1];
index++;
}
}
for (int i = start; i <= end; i++) {
arr[i][0] = tmp[i][0];
arr[i][1] = tmp[i][1];
}
}
}
람다식을 이용한 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.io.IOException;
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];
StringTokenizer st;
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, (e1, e2) -> {
if(e1[0] == e2[0]) {
return e1[1] - e2[1];
} else {
return e1[0] - e2[0];
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i< N ; i++) {
sb.append(arr[i][0] + " " + arr[i][1]).append('\n');
}
System.out.println(sb);
}
}