티스토리 뷰

Solved.ac Class 완전정복 프로젝트

Class : 2 ~ 2 ++

 


 

링크

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

 

11651번: 좌표 정렬하기 2

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

www.acmicpc.net

문제

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

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

출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

 

접근방법

 y좌표를 기준으로 오름차순 정렬을 요구하는 문제이다. 단, y좌표가 같다면 x좌표를 기준으로 오름차순을 만드는 2차원 정렬이다. 이 문제 또한 정렬의 조건이 일반적이지 않은 특수한 정렬이다. 비교조건을 만들어 쓸 수도 있겠다는 생각을 가지고 풀이에 들어가자.

 

풀이

 ArrayList에 1차원 배열을 담아 Collection객체의 sort를 이용하여 풀었다. 배열은 0인 덱스에 x 좌표, 1인 덱스에 y 좌표로 정의하였고, 정렬 조건은 다음과 같이 y값이 같은 경우에만 x로 2차 정렬을 시도하고 아닌 경우에는 y값에서 정렬을 시도한다.  

 

자세한 방법은 아래의 더보기를 참고바란다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {

    public static void main(String[] args) throws IOException {
        Main test = new Main();

    }

    public Main() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer stk ;
        int tc = Integer.parseInt(br.readLine());

        List<int[]> datas = new ArrayList<>();
        for (int i = 0; i < tc; i++) {
            int[] info = new int[2];
            stk = new StringTokenizer(br.readLine()," ");
            info[0] = Integer.parseInt(stk.nextToken());
            info[1] = Integer.parseInt(stk.nextToken());
            datas.add(info);
        }
        solution(datas);

        for (int[] data : datas){
            for (int info : data){
                sb.append(info+" ");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
    //y를 기준으로 우선 정렬 후, 같을 경우에 한하여 2차정렬
    public void solution( List<int[]> datas) {
        Collections.sort(datas, (o1,o2)->{
            if(o1[1] == o2[1]){
                if(o1[0] < o2[0]){
                    return  -1;
                }else{
                    return  1;
                }

            }else{
                return Integer.compare(o1[1],o2[1]);
            }
        });
    }

}

 

결과

 

cf.) 비슷한 유형

 


포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.

더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.

읽어주셔서 감사합니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함