ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 백준 - 좌표 정렬하기
    Algorithm 2024. 4. 17. 17:54

     

    좌표 정렬하기 백준

    https://www.acmicpc.net/problem/11650

     

    문제 

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

     

    제한 사항

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

     

    생각한 단계는1번째 사용자로 부터 입력을 받는다.2번째 정렬을 한다 x값이 같은 경우 y기준으로 정렬한다.3번째 출력한다.

     

    코드 작성시 주의한 점과 배운점

    1. 입력 데이터 수가 많기 때문에 Scanner보다는 BufferReader를 사용해야 한다.

    2. 한번에 입력을 받고 뒤에서 정렬하는게 코드를 보기에 편해 보였다. ( 입력과 동시에 매번 정렬하는 코드 보다 )

    3. 정렬과 출력을 하려했는데 list의 API에는 sort가 void이기때문에 체인메서드가 붙지 않았고 따라서 개별로 출력을 했다.

    4. 이후에 gpt를 통해서 물어보니 Stream api를 통한 정렬과 출력을 알려줬다.

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            List<int[]> list = new ArrayList<>();
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            int n = Integer.parseInt(reader.readLine()); // 정렬 하려는 배열의 수
    
            // 사용자로부터 좌표 정보 입력 받기
            for (int i = 0; i < n; i++) {
                String s = reader.readLine();
                String[] xyArrays = s.split(" "); // 공백으로 분리
    
                list.add(new int[]{ Integer.parseInt(xyArrays[0]), Integer.parseInt(xyArrays[1])});
            }
            
            reader.close();
    
            // sortAPI 사용하여 정렬
            list.sort((a, b) -> {
                if (a[0] != b[0]) { // x 값으로 기본 정렬
                    return Integer.compare(a[0], b[0]);
                }
                return Integer.compare(a[1], b[1]); // x 값이 같으면 y 값으로 정렬
            });
    
            // 정렬된 정보 출력 작업
            list.forEach(item -> {
                System.out.println(item[0] +" "+ item[1]);
            });
        }
    }

     

     

    스트림으로 사용하여 한번에 체인메서드로 출력시 아래 코드로 가능하다. ( GPT로 수정 )

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            List<int[]> list = new ArrayList<>();
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            int n = Integer.parseInt(reader.readLine()); // 정렬 하려는 배열의 수
    
            for (int i = 0; i < n; i++) {
                String s = reader.readLine();
                String[] xyArrays = s.split(" "); // 공백으로 분리
    
                list.add(new int[]{ Integer.parseInt(xyArrays[0]), Integer.parseInt(xyArrays[1])});
            }
            
            reader.close();
    
            // 스트림을 사용하여 정렬하고 바로 출력
            list.stream()
                    .sorted(Comparator.comparingInt((int[] arr) -> arr[0]) // x 값으로 기본 정렬
                            .thenComparingInt(arr -> arr[1])) // x 값이 같으면 y 값으로 정렬
                    .forEach(arr -> System.out.println(arr[0] + " " + arr[1]));
        }
    }

     

    생소한 API는 ComaringInt와 연결된 thenComparingInt 이다.

    ComparingInt에서 1차 정렬후에 값이 같은경우 thenComparingInt 메서드를 통해서 정렬을 시도한다.

     

    댓글

Designed by Tistory.