본문 바로가기
백준알고리즘

백준알고리즘:p11650, p11651 좌표 정렬하기

by socialcomputer 2021. 4. 6.
반응형

분류: 정렬

 

문제

 

comparator를 이용해서 풀었다. 

comparator를 쓰려면 compare 메소드를 오버라이드 해줘야 한다. 

-comparator 인터페이스를 쓰는 경우 : 정렬 대상 클래스의 코드를 직접 수정할 수 없는 경우

-또는, 객체에 이미 존재하고 있는 정렬 기준과 다른 정렬 기준으로 정렬할 경우

코드

//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨 
package sort;

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 p11650 {
//좌표정렬 comparator을 람다식 없이.
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = new int[n][2];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(arr, new Comparator<int[]>(){
			@Override
			public int compare(int[] e1, int[] e2) {
				if(e1[0]==e2[0]) {
					return e1[1] -e2[1];
				}
				else {return e1[0] - e2[0];}
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<n; i++) {
			sb.append(arr[i][0]+" "+arr[i][1]+"\n");
		}
		System.out.print(sb);
	}

}

▶람다식으로 해보기

package sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class p11650_1 {
//좌표정렬 comparator을 람다식으로
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = new int[n][2];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(arr, (e1, e2)->{
			if(e1[0]==e2[0]) {
				return e1[1] -e2[1];
			}
			else {
				return e1[0] - e2[0];
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<n; i++) {
			sb.append(arr[i][0]+" "+arr[i][1]+"\n");
		}
		System.out.print(sb);
	}

}

 

위와 같은 식으로 풀면 되는 11651번 문제를 같이 풀어봤다. 이번엔 y값를 먼저 오름차순 한 후, y값이 같을 때 x값을 오름차순으로 정렬해줘야 한다. (람다식 부분만 좀 다르니 살펴보자)

package sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class p11651 {
//좌표 정렬하기-11650과는 다르게 y오름차순 정렬+y같으면 x가 오름차순되게 정렬
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = new int[n][2];
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr, (e1, e2)->{
			if(e1[1]==e2[1]) {
				return e1[0]-e2[0];//y가 같을때만 x오름차순
			}
			else return e1[1]-e2[1];//일단 y오름차순 양수:우선순위큼 0:같음 음수:우선순위낮음
		});

		StringBuilder sb = new StringBuilder();
		for(int i=0; i<n; i++) {
			sb.append(arr[i][0]+" "+arr[i][1]+"\n");
		}
		System.out.print(sb);
		
	}

}

 

람다식이 생소하긴 했지만 아래 블로그를 보고 공부해봤다. 간단하게 함수를 쓸 일이 있을 때 좋을 것 같다. 

st-lab.tistory.com/110

또 comparator과 더불어 comparable도 같이 공부를 했는데 아래 블로그를 보고 참고해서 공부했다. 

www.daleseo.com/java-comparable-comparator/

cwondev.tistory.com/15

 

 

내가 다시 정리한 후 아래에 링크를 달아놔야겠다.

                                                    

 


채점결과

 

링크 www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

 

반응형

댓글