백준 11650번: 좌표 정렬하기

won·2023년 4월 2일
0

알고리즘 문제풀이

목록 보기
29/32

11650번: 좌표 정렬하기

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

이 문제는 예전에 병합 정렬로 푼 적이 있다.
그러나 11651번을 풀때 시간초과가 나서 람다식을 이용한 방식을 다시 배웠다.
학원에서 람다식을 막 다시 배웠기도 하고 연습 하는 겸 해보았다.

이 풀이에서는 Comparator 클래스를 가져와 compare 메소드를 오버라이딩 하여 사용하는데 여기서 제네릭 타입 개념도 다시 상기시킬 수 있었다.

기존 병합 정렬을 이용한 풀이

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

public class Main {
	static int tmp[][];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// n: 입력할 좌표 갯수
		int n = Integer.parseInt(br.readLine());

		// 좌표 저장 2차원 배열
		int[][] arr = new int[n][2];
		tmp = new int[n][2];
		// 좌표 입력
		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}

		// 정렬
		mergeSort(arr, 0, n - 1);

		// 출력
		for (int i = 0; i < n; i++) {
			System.out.println(arr[i][0] + " " + arr[i][1]);
		}
	}

	private static void mergeSort(int[][] arr, int start, int end) {
		if (start < end) {
			int mid = (start + end) / 2;
			mergeSort(arr, start, mid);
			mergeSort(arr, mid + 1, end);
			merge(arr, start, mid, end);
		}
	}

	private static void merge(int[][] arr, int start, int mid, int end) {
		int part1 = start;
		int part2 = mid + 1;
		int index = start;
		while (part1 <= mid && part2 <= end) {
			if (arr[part1][0] < arr[part2][0]) {
				tmp[index][0] = arr[part1][0];
				tmp[index][1] = arr[part1][1];
				part1++;
			} else if (arr[part1][0] > arr[part2][0]) {
				tmp[index][0] = arr[part2][0];
				tmp[index][1] = arr[part2][1];
				part2++;
			} else {
				// x좌표가 같을 경우 처리
				if (arr[part1][1] < arr[part2][1]) {
					tmp[index][0] = arr[part1][0];
					tmp[index][1] = arr[part1][1];
					part1++;
				} else {
					tmp[index][0] = arr[part2][0];
					tmp[index][1] = arr[part2][1];
					part2++;
				}
			}
			index++;
		}
		if(part1>mid) {
			for(int t=part2;t<=end;t++) {
				tmp[index][0]= arr[t][0];
				tmp[index][1]= arr[t][1];
				index++;
			}
		}
		else {
			for(int t=part1;t<=mid;t++) {
				tmp[index][0]= arr[t][0];
				tmp[index][1]= arr[t][1];
				index++;
			}
		}
		
		for (int i = start; i <= end; i++) {
			arr[i][0] = tmp[i][0];
			arr[i][1] = tmp[i][1];
		}
	}

}

람다식을 이용한 풀이

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

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());
		
		int[][] arr = new int[N][2];
		
		StringTokenizer st;
		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]).append('\n');
		}
		System.out.println(sb);
	}


}
profile
뭐라도 하자

0개의 댓글