달달한 스토리

728x90
반응형

출처 핀터레스트

 

추석이다.. 아고 언제 내려가나..

 

문제 하나 풀어보았다.

 

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

public class Test11650 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        Location[] locations = new Location[N];

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

        Arrays.sort(locations);

        for(Location loc : locations) {
            sb.append(loc.x).append(" ").append(loc.y).append("\n");
        }

        System.out.print(sb);
    }

    static class Location implements  Comparable<Location>{

        private final int x;
        private final int y;

        Location(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public int compareTo(Location location) {
            //만약 기존 x좌표가 새로운 x좌표보다 작으면 뒤로감 -1 0 1
            if(this.x < location.x) {
                return -1;
            } else if(this.x == location.x) {
                //만약 x는 같은데 기존 y좌표가 새로운 y좌표보다 작으면 뒤로감 -1 0 1
                if(this.y < location.y) {
                    return -1;
                }
                //앞으로 감
                return 1;
            }
            //앞으로 감
            return 1;
        }
    }
}

 

답안을 보니까 2차원 배열을 쓰는 것을 보았다.

 

나같은 경우 모델 클래스를 만들고,

 

클래스에 비교할 수 있는 인터페이스인

 

Comparable을 구현하였다.

 

Comaparable로 커스텀하여 정렬값을 구현하게 되면,

 

해당 클래스를 정렬(Arrays.sort())할때

 

compareTo() 메서드에 정의된 형태로 정렬이 되는 형식이다.

 

2차원 배열로 구현 할 때는 

 

Array.sort() 메서드에서 람다로 구현하더라..

 

그게 더 간결해보이기도 해서 이런 방법도 있구나 하고 참고하였다.

 

람다식은 다음과 같다.

 

반응형

 

Arrays.sort(locations, (e1, e2) -> {
    if(e1.x < e2.x) {
        return -1;
    } else if(e1.x == e2.x) {
        //만약 x는 같은데 기존 y좌표가 새로운 y좌표보다 작으면 뒤로감 -1 0 1
        if(e1.y < e2.y) {
            return -1;
        }
        //앞으로 감
        return 1;
    }
    //앞으로 감
    return 1;
});

2차원 배열로 만들고,

 

클래스를 굳이 만들지 않아도 다음과 같이 식을 구현할 수 있었다.

 

하지만, 효율은 내 방법이 더 속도가 빨라서 기분이 좋았다 ㅎㅎ

 

여러 방법도 배워보자!!

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading