본문 바로가기
백준

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

by naahy 2022. 12. 17.

문제

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

 

입력

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

 

출력

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

 



계속 고민해봤는데 정말 답이 안 나왔다.
0행에 x값, 1행에 y값을 저장하는 2차원 배열로 풀어보자니 0행 배열을 정렬하면 0행 배열과 1행 배열의 연관성이 끊김.
그래서 아예 String으로 입력 받아 [ic]Arrays.sort()[/ic] 함수를 사용해 x값을 기준으로 정렬한 뒤 다시 x좌표가 같은 y만 정렬해보려 했는데... 애매하게 계속 꼬였다.


0행에 x, 1행에 y를 저장하는 방법이 아닌 0열에 x, 1열에 y를 저장하는 방법 사용
람다식을 사용해 이중 배열을 정렬한다.

 

참고

https://selfinvestfriends.tistory.com/134

 

자바 comparator 사용법

계층구조 package: java.util.Comparator 정의 compare메서드를 사용해서 여러가지 특별한 조건을 가진 정렬을 구현하기 위한 인터페이스. 예를 들어, 사이즈별로 오름차순으로 정렬하고, 같은 사이즈들

selfinvestfriends.tistory.com

https://itpro.tistory.com/136

 

[Java] 2차원 배열 정렬하기(Comparator, Lamda)

이중 배열을 정렬하고 싶은 경우 Comparator를 쓰거나 람다식을 쓰면 됩니다. 예를 들어 int[][] arrays = { { 0, 3 }, { 2, 6 }, { 1, 9 }, { 1, 8 } }; 위의 이중 배열의 순서를 아래와 괕이 변경하는 방법입니다. {

itpro.tistory.com

https://st-lab.tistory.com/110

 

[백준] 11650번 : 좌표 정렬하기 - JAVA [자바]

www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항

st-lab.tistory.com


 

풀이

  • 좌표 저장할 int 배열 생성
    • 입력 받은 N의 길이만큼 행 생성
    • x, y 저장할 2열 생성
    • [ic]new int[n][2][/ic]
  • 람다식 사용해 2차원 배열 정렬
    • 두 행 간 0열 비교 (x값 비교)
    • 두 값이 같으면 1열 비교 (y값 비교)

 

코드

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 br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		/*
		 * 좌표 저장
		 * 0열에 x, 1열에 y 저장
		 */
		int[][] coordinate = new int[n][2];
		
		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());
			
			coordinate[i][0] = x;
			coordinate[i][1] = y;
		}
		
		/*
		 * 람다식 사용
		 * x 값 같으면 y값 비교
		 */
		Arrays.sort(coordinate, (int[] p1, int[] p2) -> {
			if (p1[0] == p2[0])
				return p1[1] - p2[1];
			else
				return p1[0] - p2[0];
		});
		
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<n; i++) {
			sb.append(coordinate[i][0]).append(' ').append(coordinate[i][1]).append('\n');
		}
		System.out.println(sb);
	}

}

 

댓글