알고리즘/백준

[백준/JAVA] 11651번 : 좌표 정렬하기 2

092 2024. 3. 27. 10:34
문제 링크 : https://www.acmicpc.net/problem/11651
 

11651번: 좌표 정렬하기 2

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

www.acmicpc.net

 

문제 내용 : 아래 더보기
더보기

- 문제

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

 

- 입력

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

 

- 출력

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

 

정답 코드 ) Arrays.sort() 사용
import java.io.*;
import java.util.*;

class Point implements Comparable<Point> {
	int x; // x 좌표
	int y; // y 좌표

	@Override
	public int compareTo(Point o) {
		if (this.y == o.y)
			return this.x - o.x; // y좌표가 같으면 x좌표로 정렬
		return this.y - o.y;
	}

	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}

}

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 입력받을 좌표의 개수 N 입력 받기
		int N = Integer.parseInt(br.readLine());

		// Point 객체 배열 초기화
		Point[] points = new Point[N];

		// N개의 점에 대한 정보 입력받기
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			points[i] = new Point(x, y); // Point 객체 생성 및 배열에 추가
		}

		// Arrays.sort 메서드 사용해서 Point 객체 배열 정렬
		// Arrays.sort 메서드는 Dual-Pivot Quicksort 알고리즘을 기반으로 해서 평균적으로 더 빠른 성능 제공
		// Point 클래서에서 정의한 compareTo 메서드에 따라 정렬됨
		// 데이터가 많은 경우 퀵 정렬 보다 빠름
		Arrays.sort(points);


		// 정렬된 점들 출력
		for (Point p : points) {
			System.out.println(p.x + " " + p.y);
		}

		br.close();
	}