지구정복

[정렬] 백준 - 좌표 정렬하기2 본문

데이터 엔지니어링 정복/Algorithm

[정렬] 백준 - 좌표 정렬하기2

nooh._.jl 2021. 7. 27. 14:31
728x90
반응형

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

 

-문제해설

이전에 포스팅했던 좌표정렬하기와 아주 유사한 문제이다. 이번에는 y좌표 오름차순 정렬하되 같은 y값인 경우 x좌표를 오름차순으로 정렬하는 문제이다.

 

이번에는 자바와 파이썬 둘 다 sort함수의 익명함수를 이용해서 풀어봤다.

 

 

-자바

package sort;

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class BJ11651 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt( br.readLine() );
		StringTokenizer st;
		
		Point[] arr = new Point[n];
		for( int i=0; i<n; i++ ) {
			st = new StringTokenizer( br.readLine() );
			arr[i] = new Point( Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) );
		}
		
		Arrays.sort( arr, new Comparator<Point>() {
			@Override
			public int compare(Point o1, Point o2) {
				if( o1.y == o2.y ) return o1.x - o2.x;
				else return o1.y - o2.y;
			}
		});
		
		StringBuffer sb = new StringBuffer();
		for( int i=0; i<n; i++ ) sb.append( arr[i].x+" "+arr[i].y+"\n" );
		System.out.println( sb );
	}
}

 

-파이썬

import sys
readline = sys.stdin.readline
n = int( readline() )

arr = [ [0]*2 for _ in range( n ) ]

for i in range( n ):
    a, b = map( int, readline().split() )
    arr[i][0] = a; arr[i][1] = b

arr.sort( key= lambda x : ( x[1], x[0] ) )

for i in range( n ):
    print( arr[i][0], arr[i][1] )
728x90
반응형
Comments