[백준] 11650: 좌표 정렬하기

SuKong·2020년 8월 13일
0
post-thumbnail

'11650- 좌표 정렬하기' 문제로 이동!

👉문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

👉입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

예시 -
5
3 4
1 1
1 -1
2 2
3 3

👉출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

예시 -
1 -1
1 1
2 2
3 3
3 4


✍내 풀이

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[][] arr = new int[num][2];
		for( int i = 0 ; i < num ; i++ ) {
			arr[i][0] = sc.nextInt();
			arr[i][1] = sc.nextInt();
 		}
		arr = sort(arr);
		for( int i = 0 ; i < num ; i++ ) {
			System.out.println(arr[i][0] + " " + arr[i][1]);
		}
	}
	
	static int[][] sort(int[][] arr){
		Arrays.sort(arr, new Comparator<int[]> () {
			public int compare(int[] o1, int[] o2) {
				if(o1[0] == o2[0]) return Integer.compare(o1[1], o2[1]);
				return Integer.compare(o1[0], o2[0]);
			}
		});
		
		return arr;
	}
}


✍Note

  • Arrays클래스에서 제공하는 sort를 커스텀해서 활용하는 방법
  1. Comparator를 생성해서 compare함수를 오버라이딩 함으로써 커스텀하는 방식
  2. Comparable인터페이스의 compareto함수를 오버라이딩 함으로써 커스텀하는 방식

나는 Comparator를 새로 생성해서 사용하는 방식 (첫번째 방식) 을 활용했다.
(참고블로그 : https://cornswrold.tistory.com/203 )


  • compare함수의 알고리즘은 다음과 같다.
    arr[][]에서 각 인자를 비교할 때는 arr[]단위로 비교가 된다.
    arr1[0] 과 arr2[0] 같을 때, 즉 x좌표가 같을 때에는 arr1[1]과 arr2[1]끼리 비교한 값을 리턴한다.
    그렇지 않을 경우는 x값 즉 arr[0]값 끼리 비교한 값을 리턴한다.

  • Integer.compare(a, b)의 리턴값 :
    a>b : 1
    a==b : 0
    a<b : -1

  • 위의 코드에서 구현한 compare함수와 다음코드는 같은 알고리즘을 의미한다.

//위에서 구현한 Integer.compare함수를 활용한 코드 
if(o1[0] == o2[0]) return Integer.compare(o1[1], o2[1]);
return Integer.compare(o1[0], o2[0]);

//Integer.compare함수를 활용하지 않은 직관적인 코드
if(o1[0] > o2[0]) return 1;
if(o2[0] > o1[0]) return -1;
if(o1[1] > o2[1]) return 1;
if(o2[1] > o1[1]) return -1;
return 0;
profile
안녕하세요 🤗

0개의 댓글