CodingTest/BOJ
[백준 / 11650번] 좌표 정렬하기 - (Java - TimSort - 정렬)
JONG_UK
2023. 2. 8. 16:55
728x90
반응형
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net
⭐️ 코드
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
// 좌표 정렬하기 - 실버5
public class Main {
private static class Coordinate{
int x, y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
Coordinate[] coordinates = new Coordinate[N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
coordinates[i] = new Coordinate(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
Arrays.sort(coordinates, (o1, o2) -> {
if (o1.x == o2.x) {
return Integer.compare(o1.y, o2.y);
}
return Integer.compare(o1.x, o2.x);
});
for (Coordinate coordinate : coordinates) {
bw.write(coordinate.x + " " + coordinate.y +"\n");
}
bw.flush();
}
}
💡 문제 풀이
이 문제는 정렬 알고리즘을 사용하여 푸는 문제다.
두 가지 기준에 맞춰서 정렬하는 방법을 생각하기 까지가 어려운 문제다.
이번 문제에서는 TimSort를 사용해서 진행하기로 한다.
두 좌표가 주어지면 새로운 클래스를 만들어 그곳에 저장해 둘 예정이다.
private static class Coordinate{
int x, y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
}
Coordinate[] coordinates = new Coordinate[N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
coordinates[i] = new Coordinate(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
위에서 클래스 배열을 만들어서 Coordinate 클래스에 입력된 좌표값들을 넣어주었다.
이제 정렬을 진행해야 하는데 람다식을 이용해서 먼저 o1으로 들어오는 coordinate [i]. x와 coordinate [i+1]. x의 값이 같은지를 비교하고 값이 작다면 조건문을 실행한다.
값이 같을 경우엔 y좌표가 오름차순 기준으로 정렬되어야 하므로, Integer.compare(o1.y, o2.y); 를 이용해서 정렬해 준다.
Arrays.sort(coordinates, (o1, o2) -> {
if (o1.x == o2.x) {
return Integer.compare(o1.y, o2.y);
}
return Integer.compare(o1.x, o2.x);
});
나머지는 출력하면 끝인데 정렬에 대한 자세한 설명은 다른 포스트에서 하도록 하겠다.
👀 후기
어렵긴 하지만 정렬 알고리즘을 사용하는 방법이 다양하고, 클래스를 이용하여 하면 상당히 편했다.
이중포문 보다 클래스가 편하지만 이중포문 방식의 코딩도 노력해 봐야겠다.
728x90
반응형