2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
✅ 두 점을 2차원 배열에 저장해서 정렬해야겠다! 까지는 생각했는데 정렬 시 사용하는
Arrays.sort()
는 2차원 배열을 지원하지 않는다. 이를 어째야 하나 고민하다 구글링을 열심히 했다,, 해당 글에서는Comparator
인터페이스를 사용하는 방식과 람다식을 사용하는 2가지 방식으로 해결하였다!
Comparator
인터페이스 : 두 매개변수 객체를 비교 ➡️compare(o1, o2)
메서드 오버라이딩 필수!
comparator(int[] o1, int[] o2)
의 경우, 2차원 배열을 행 단위로 끊어서 비교한다. 예제 값을 입력한 경우 [3, 4], [1. 1], [1. -1], ... 을 각각 비교하는 것이다! 첫번째 x 좌표o1[0]
과 두번째 x좌표o2[0]
를 비교하여 두 좌표의 값이 같은 경우 y좌표o1[1], o2[1]
을 사용하여 정렬하고, 같지 않은 경우에는 x좌표o1[0], o2[0]
을 사용하여 정렬한다.
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}
- 람다식 : 함수를 하나의 식으로 간단하게 표현한 것
기본적인 알고리즘은 같으며,Comparator
인터페이스의compare()
메서드를(매개변수) -> 실행문
형태로 좀 더 간단하게 표현할 수 있다!
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, (arr1, arr2) -> {
if(arr1[0] == arr2[0]) {
return arr1[1] - arr2[1];
} else {
return arr1[0] - arr2[0];
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}
(첫번째 풀이는 int[][] 대신 Integer[][]를 사용한 풀이. 메모리랑 시간을 좀 더 잡아먹는다,,)
2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
✅ y좌표 순으로, y좌표가 같으면 x좌표 순으로 정렬하는, 위 문제와 97% 정도 동일한 문제이다! x좌표 대신 y좌표 순으로 정렬하는 문제이다! 위 코드에서
Arrays.sort(람다식)
구문 안에 x좌표와 y좌표의 위치만 수정하고 나머지는 동일하므로 설명은 생략!
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, (arr1, arr2) -> {
if(arr1[1] == arr2[1]) {
return arr1[0] - arr2[0];
} else {
return arr1[1] - arr2[1];
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}