2 분 소요

좌표정렬

문제

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

입력

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

출력

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

문제 이해해보기

첫입력은 점의 갯수 n을 입력받고, 2번째는 x와y값을 하나씩 받는다. 해당 문제를 Comparator을 이용해서 풀수 있을거 같다.

그리고 해당 문제도 공백으로 나누고 있으므로 StringTokenizer사용하면 될거같다.

2차원 배열

이전 정렬 문제의 경우 1차원 배열만 사용하여 정렬하는 기능들만 사용했지만 이번문제는 1차원 배열하나 가지고는 어렵다고 판단하여 찾게 되었다.

2차원 배열 선언 . 및 생성방법

2차원 배열을 아래와 같이 선언과 생성을 하게되면, “레퍼런스 변수”와 int타입의 저장공간 6개가 아래 그림과 같이 생성된다.

스크린샷 2024-07-06 오전 11.38.04

(방법1) 배열의 선언과 생성을 나누어 사용

int[][] num; //2차원 배열에 대한 레퍼런스 변수 선언
num = new int[2][3]; // 2차원 배열생성(2차원 배열의 저장공간 할당)

(방법2) 배열의 선언과 생성을 한줄로 합쳐서 사용

int[][] num = new int[2][3];

출처 : https://kadosholy.tistory.com/87

레퍼런스 변수

객체의 메모리 주소를 저장하는 변수.

즉 실제 데이터가 저장된 위치를 가리키는 역할이다.

자바 같은 객체 지향 프로그레밍 언어에서 객체를 생성할 때, 해당 객체의 주소를 저장하는 변수가 레퍼런스 변수이다.

예시

MyClass obj = new MyClass();

여기서 obj는 MyClass의 레퍼런스 변수이다. new MyClass()에 의해 생성된 객체의 메모리 주소를 obj가 가리키게 된다.

내가 레퍼런스 변수와 착각 한것은 int nums 같은 기본형 변수 라고하는데

실제 데이터를 직접 저장하는 변수라고 한다.

기본형 변수는 정수, 실수, 문자, 논리 값등을 저장 할수있다고 한다.

두개의 차이점을 요약하자면

  • 레퍼런스 변수 : 객체의 메모리 주소를 저장하는 변수.
  • 기본형 변수 : 실제 데이터를 직접 저장하는 변수.

객체 메모리 주소와 실제 데이터에 관한 이야기는 cs관련 공부할때 다시 작성하겠다.

정답코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

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

        // N의 수 입력
        int n = Integer.parseInt(br.readLine());
        //n개의 행과 2개의 열 생성 (2차원 배열)
        int arr[][] = new int[n][2];

        StringTokenizer st;

        //arr에 받을 x와y의 값 입력
        // StringTokenizer이 공백으로 구분을해서 두개로 따로 입력 받지한고 공백으로 구분하면 알아서 들어간다.
        for(int i = 0; i < n; i++){
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
        
        //int[]인 이유는 int[]가 배열의 원소이며 두개의 int[]배열을 비교하는 것
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] e1, int[] e2){
                if(e1[0] == e2[0]){
                    return e1[1] - e2[1];
                }else{
                    return e1[0] - e2[0];
                }
            }
        });

        StringBuilder sb = new StringBuilder();
        //append = 여러 타입의 데이터를 받아들이며 각테이터 타입에 맞게 문자열로 변환하여 버퍼에 추가
        //쉽게말해서 그양 연결해주는 친구이다.
        for(int i = 0; i < n; i++){
            sb.append(arr[i][0]).append(" ").append(arr[i][1]).append('\n');
        }
        System.out.println(sb);
    }
}

문제를 마치며

이번 문제도 혼자서 여러가지 시도해 보았지만 다 실패하고 결국 구글 검색행이었다.

댓글남기기