🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/BOJ

[백준 / 11650번] 좌표 정렬하기 - (Java - TimSort - 정렬)

JONG_UK 2023. 2. 8. 16:55
728x90
반응형
SMALL

 

 

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
반응형
LIST