will come true

[BOJ] 백준 11650번 - 좌표 정렬하기 본문

Algorithm

[BOJ] 백준 11650번 - 좌표 정렬하기

haehyun 2021. 11. 26. 01:34
728x90

문제

https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

✔ Key Point

  • 2차원 배열 정렬

 

풀이

  1. 한 점의 x좌표, y좌표를 하나로 묶어 1차원 배열로, 이러한 점들을 2차원 배열로 저장
  2. 아래 [예제 입력 1] 의 좌표 값들을 2차원 배열로 저장하면 { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} }
    5
    3 4
    1 1
    1 -1
    2 2
    3 3
  3. 각 점을 x좌표를 기준으로 오름차순 정렬, x좌표가 같을 경우 y좌표를 기준으로 오름차순 정렬
  4. 배열을 정렬하는 Arrays.sort() 메서드 호출 시 비교 기준 Comparator를 정해준다.

 

1차원 배열 정렬

  • Arrays.sort() 메서드를 사용해 배열 요소를 오름차순으로 정렬
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		int[] pos = { 3, 1, 1, 2, 3 };
		
		Arrays.sort(pos);
		
		System.out.println(Arrays.toString(pos));
	}
}
[1, 1, 2, 3, 3]

 

2차원 배열 정렬

  • x좌표를 기준으로 오름차순 정렬
  • Comparator.comparingInt() 메서드를 사용해 비교 기준 요소를 지정
    (x좌표 = 2차원 배열의 각 요소인 1차원 배열에서 첫번째 값)
import java.util.Arrays;
import java.util.Comparator;

public class Main {
	public static void main(String[] args) {
		int[][] pos = { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} };
		
		Arrays.sort(pos, Comparator.comparingInt(o1 -> o1[0]));
		
		for(int[] arr : pos) {
			System.out.println(Arrays.toString(arr));
		}
	}
}
[1, 1]
[1, -1]
[2, 2]
[3, 4]
[3, 3]

 

  • x좌표 기준으로 오름차순 정렬, x좌표가 같을 경우 y좌표로 오름차순 정렬
  • 람다식을 사용해 Comparator를 직접 정의
    o1, o2 = 정렬 대상인 2차원 배열 pos의 각 요소 = x, y좌표를 저장하고 있는 각 1차원 배열
    두 1차원 배열에서 x좌표끼리, y좌표끼리 차례로 대소 비교 수행
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		int[][] pos = { {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3} };
		
		Arrays.sort(pos, (o1, o2) -> {
			if(o1[0] == o2[0])
				return Integer.compare(o1[1], o2[1]);
			else
				return Integer.compare(o1[0], o2[1]);
		});
		
		for(int[] arr : pos) {
			System.out.println(Arrays.toString(arr));
		}
	}
}
[1, -1]
[1, 1]
[2, 2]
[3, 3]
[3, 4]

 

코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();
		
		int N = sc.nextInt();
		int[][] pos = new int[N][2];	//좌표 배열
		
		for(int i = 0; i < N; i++) {
			 pos[i][0] = sc.nextInt();	//x좌표
			 pos[i][1] = sc.nextInt();	//y좌표
		}
		
		//int[][] 의 비교대상인 요소 o1, o2는 각각 int[] 타입
		Arrays.sort(pos, (o1, o2) ->{
			if(o1[0] == o2[0])
				return Integer.compare(o1[1], o2[1]);
			else
				return Integer.compare(o1[0], o2[0]);
		});
		
		for(int[] arr : pos) {
			sb.append(String.format("%d %d\n", arr[0], arr[1]));
		}
		
		System.out.println(sb);
	}

}
728x90

'Algorithm' 카테고리의 다른 글

DP - 개미 전사  (0) 2021.12.13
[BOJ] 백준 11652번 - 카드  (0) 2021.11.30
[BOJ] 백준 1463번 - 1로 만들기 (Java)  (0) 2021.11.15
[BOJ] 백준 10808번 - 알파벳 개수 (Java)  (0) 2021.11.15
[BOJ] 백준 2445번 - 별 찍기 8  (0) 2021.11.11
Comments