Algorithms 🚀/Baekjoon

[백준/11650번] 좌표 정렬하기 - JAVA[자바]

728x90

www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

이번 정렬 문제는 조금 더 심화된 문제입니다.

 

정렬 조건 2개를 사용해야 하는 문제이고 2차원 배열도 사용해야하는 문제입니다.

 

제가 작성한 코드에서는 println()으로 출력하면 시간 초과가 떠서 BufferedWriter를 사용해서 풀었습니다.

 

package baekjoon.level12;

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class BOJ_11650 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        Integer[][] position = new Integer[N][2];


        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            position[i][0] = Integer.parseInt(st.nextToken());
            position[i][1] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(position, new Comparator<Integer[]>() {
            @Override
            public int compare(Integer[] o1, Integer[] o2) {
                if(o1[0].equals(o2[0])) {
                    return o1[1] - o2[1];
                }else {
                    return o1[0] - o2[0];
                }
            }
        });

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        for (Integer[] pos : position) {
            bw.write(pos[0] + " " + pos[1] + "\n");
        }

        bw.flush();

        bw.close();
        br.close();
    }
}

 

 

2차원 배열을 만들고 StringTokenizer를 이용해서 각각의 좌표값을 넣어주었습니다.

 

좌표값이 들어간 배열을 Comparator로 정렬하면 끝입니다. (조건이 2개인 것만 조심하면 됩니다!!)

 

compare()의 매개변수인 o1, o2는 [1,1] [2,2]의 형식으로 출력됩니다.

 

우리는 x를 기준으로 오름차순으로 정렬하되, x값이 같으면 y를 기준으로 오름차순으로 정렬해야 합니다.

 

o1[0]은 첫 번째 배열의 x좌표이고, o2[0]은 두 번째 배열의 x좌표입니다.

 

이 두 값이 같으면 y좌표를 기준으로 정렬하도록 구현되어있는 것을 볼 수 있습니다.

 

만약 x좌표가 같지 않다면 x좌표를 기준으로 정렬하게 됩니다!!

 

 

저는 처음에는 출력을 System.out.println()을 사용해서 했는데 시간초과가 뜨더라구요

 

아마도 println()을 이용한 출력이 많은 성능을 요구하기 때문이라고 생각됩니다.

 

알고리즘 문제를 풀면서도 참 많은 것을 신경써야 하는 것 같습니다 ㅠㅠ

 

마지막으로 BufferedWriter와 Println()의 성능에 대한 것은 정리해서 포스팅 할 예정입니다!!

728x90