[백준] 11650 ~ 11651. 좌표 정렬하기 ~ 2

진예·2023년 10월 16일
0

Baekjoon : JAVA

목록 보기
30/76
post-thumbnail

📌 문제 : 1

[11650] 좌표 정렬하기

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

⬇️ 입력

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

⬆️ 출력

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

💡 코드 : 1

✅ 두 점을 2차원 배열에 저장해서 정렬해야겠다! 까지는 생각했는데 정렬 시 사용하는 Arrays.sort()2차원 배열을 지원하지 않는다. 이를 어째야 하나 고민하다 구글링을 열심히 했다,, 해당 글에서는 Comparator 인터페이스를 사용하는 방식과 람다식을 사용하는 2가지 방식으로 해결하였다!

  1. Comparator 인터페이스 : 두 매개변수 객체를 비교 ➡️ compare(o1, o2) 메서드 오버라이딩 필수!

    comparator(int[] o1, int[] o2)의 경우, 2차원 배열행 단위로 끊어서 비교한다. 예제 값을 입력한 경우 [3, 4], [1. 1], [1. -1], ... 을 각각 비교하는 것이다! 첫번째 x 좌표 o1[0]두번째 x좌표 o2[0]를 비교하여 두 좌표의 값이 같은 경우 y좌표 o1[1], o2[1]을 사용하여 정렬하고, 같지 않은 경우에는 x좌표 o1[0], o2[0]을 사용하여 정렬한다.
import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = 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());
		}
		
		Arrays.sort(arr, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				if(o1[0] == o2[0]) {
					return o1[1] - o2[1];
				} else {
					return o1[0] - o2[0];
				}
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}	

  1. 람다식 : 함수하나의 식으로 간단하게 표현한 것

    기본적인 알고리즘은 같으며, Comparator 인터페이스의 compare() 메서드를 (매개변수) -> 실행문 형태로 좀 더 간단하게 표현할 수 있다!
import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = 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());
		}
		
		Arrays.sort(arr, (arr1, arr2) -> {
			if(arr1[0] == arr2[0]) {
				return arr1[1] - arr2[1];
			} else {
				return arr1[0] - arr2[0];
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}	

(첫번째 풀이는 int[][] 대신 Integer[][]를 사용한 풀이. 메모리랑 시간을 좀 더 잡아먹는다,,)


📌 문제 : 2

[11651] 좌표 정렬하기 2

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

⬇️ 입력

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

⬆️ 출력

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

💡 코드 : 2

y좌표 순으로, y좌표가 같으면 x좌표 순으로 정렬하는, 위 문제와 97% 정도 동일한 문제이다! x좌표 대신 y좌표 순으로 정렬하는 문제이다! 위 코드에서 Arrays.sort(람다식) 구문 안에 x좌표와 y좌표의 위치만 수정하고 나머지는 동일하므로 설명은 생략!

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[][] arr = 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());
		}
		
		Arrays.sort(arr, (arr1, arr2) -> {
			if(arr1[1] == arr2[1]) {
				return arr1[0] - arr2[0];
			} else {
				return arr1[1] - arr2[1];
			}
		});
		
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<n;i++) {
			sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}	

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글