728x90
반응형
⭐️ 코드
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
반응형
'CodingTest > BOJ' 카테고리의 다른 글
[백준 / 10989번] 수 정렬하기 3 - (Java - Counting Sort / 개수 정렬) (0) | 2023.02.08 |
---|---|
[백준 / 17298번] 오큰수 - (Java - Stack) (0) | 2023.01.21 |
[백준 / 11660번] 구간 합 구하기5 - (Java - 누적 합) (0) | 2023.01.09 |
[백준 / 11659번] 구간 합 구하기4 - (Java - 누적 합) (2) | 2023.01.08 |
[백준 / 1002번] 터렛 - (Java - 수학) (0) | 2022.12.22 |