백준 11650: 좌표 정렬하기(java)
문제
문제를 보자마자 2차원 배열을 생성해 Arrays.sort()를 사용하려 했는데, Arrays.sort()로는 1차원 배열밖에 정렬할 수 없다.
(Arrays.sort() 사용하여 오름차순 정렬하기 참고)
오름차순/내림차순 정수 정렬
다들 뭔가 멋있게 정렬하던데 나는 버블정렬밖에 모른다//버블정렬int[] intArray = {7, 2, 10, 4, 8, 3, 1, 9, 5, 6};int i, j, temp;for(i=9; i>0; i--){ for(j=0; jintArray[j+1]){ //앞 원소가 뒤 원소보다 크면 앞 원소를 뒤
sysouthelloworld.tistory.com
그래서 생각한 방법이 x, y를 key와 value로 가지는 HashMap을 사용하는 것이었다.
하지만 HashMap은 key값 중복을 허락하지 않기 때문에 이것도 패스
MultiValueMap을 사용할까도 생각해 봤는데 스프링 관련이라 이것도 패스
돌고 돌아 결국 Arrays.sort()를 사용하여 풀이했다.
풀이
기본 Arrays.sort()는 2차원 배열 정렬이 어려우므로 람다식을 사용하여 확장해 준다.
위 문서를 참고하면
원본 sort() 메소드는 인자로 1차원 배열과 정렬 범위(시작점, 끝점)를 전달받는 것을 알 수 있다.
람다식을 사용해 이를 2차원 배열과 정렬 범위를 전달받는 메소드로 바꿀 수 있다.
Arrays.sort(arr, (arr1, arr2)->{
if(arr1[0]==arr2[0])
return arr1[1]-arr2[1];
else
return arr1[0]-arr2[0];
});
sort()의 인자로 2차원 배열 arr와 람다식을 전달한다. 이때 전달된 람다식 (arr1, arr2) -> { ... }는 두 배열 arr1과 arr2를 비교하여 정렬 기준을 정한다.
if(arr1[0] == arr2[0])
- 만약 arr1[0] == arr2[0]이라면 arr1[1]과 arr2[1]을 비교하여 그 차를 반환한다. x좌표가 같은 점에 대해 y좌표의 차를 반환하는 것이다. 이 값이 양수이면 arr1이 arr2보다 큰 것으로 간주되어 자리가 교체된다.
else
- x좌표가 서로 다른 점에 대해서는 arr1[0]과 arr2[0]을 비교해 그 차를 반환한다. 두 점의 x좌표를 비교하는 것이다. 차가 양수이면 arr1이 arr2보다 큰 것으로 간주되어 자리가 교체된다.
람다식으로 2차원 정렬하는 것을 제외하면 좌표를 입력받고 출력받는 것은 다른 문제들과 동일하다.
BufferedReader와 StringTokenizer를 이용하여 입력받았다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(in.readLine());
int[][] arr=new int[N][2];
for(int i=0; i<N; i++) {
StringTokenizer st=new StringTokenizer(in.readLine());
arr[i][0]=Integer.parseInt(st.nextToken()); //x좌표
arr[i][1]=Integer.parseInt(st.nextToken()); //y좌표
}
Arrays.sort(arr, (arr1, arr2)->{
if(arr1[0]==arr2[0])
return arr1[1]-arr2[1];
else
return arr1[0]-arr2[0];
});
//Arrays.sort()에
for(int i=0; i<N; i++) {
System.out.println(arr[i][0]+" "+arr[i][1]);
}
}
}