[백준 자바] 11650 좌표 정렬하기

2023. 12. 18. 18:19
728x90

 

머리가 안돌아가여....

막 맵에다 넣고 난리난리 치다가... 왜그랬지 ㅠㅠ

 

그냥 이차원 배열에 넣으면 됐다.

그리고,,,,, 람다식을 사용하면 엄청 간단하게 해결이 된다.

 

- 풀이

더보기
public class Main {
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 2차원 평면 위에 점 N개 
        int N = Integer.parseInt(br.readLine());
        
        // N개의 줄에 i번점의 위치 Xi, Yi가 주어진다.
        // 그걸 2차원 배열로 표시하자.
        int[][] map = new int[N][2]; // [][0]은 x좌표, [][1]은 y좌표
        
        // 입력받은 것 넣기
        for (int i=0; i<N; i++) {
        	String[] inputs = br.readLine().split(" ");
            
            map[i][0] = Integer.parseInt(inputs[0]);
            map[i][1] = Integer.parseInt(inputs[1]);
        } // map 완성
        
        // 정렬을 하는데, 먼저 x좌표를 기준으로 오름차순 정렬하고,
        // 만약 x좌표가 같다면 y좌표를 기준으로 오름차순 정렬.
        // 람다식 활용
        Arrays.sort(map, (o1, o2) -> {
        	if (o1[0] == o2[0]) { //x좌표가 같으면 
            	return o1[1] - o2[1];  // y좌표 기준으로 정렬 반환
            } else {
            	return o1[0] - o2[0]; // x좌표 기준으로 정렬 반환
            }
        });
        
        // 출력 : 정렬된 결과를 출력
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<map.length; i++) {
        	sb.append(map[i][0]+" "+map[i][1]+"\n");
        }
        
        System.out.println(sb);
    }
}

 

>> 람다식 쓰는 방법을 정확히 모르다보니 해답에 가까워지기가 어려웠던 것 같다. 

sort 메서드 쓸 때에도 안에 인자를 뭘 넣어야 할지도 막막해서 인자 없는 메서드만 사용했는데, 이번 기회에 람다식과 인자 있는 버전을 사용해 보아서 좋았다. 

>> 이렇게 표현이 되어 있는데, 

- Sorts the specified array of objects according to the order induced by the specified comparator

이렇게 특정 comparator로 정렬을 할 수 있다고 한다.

 

그래서 우리는 인자로 comparator를 주어야 하는 것! 

- Params: a - the array to be sorted 정렬되어야 하는 정렬을 주고,

                   c - the comparator to determine the order of the array. null이면 요소의 natural ordering. 정렬되어야 하는 기준을 준다.

 

 

그래서 실제 코드를 보면 

o1, o2로 Comparator 인자를 주었다. 

여기서 o1, o2는 배열의 각 요소를 나타낸다. 2차원 배열인 map의 각 행을 나타내는 것. 

결국 o1[0], o1[1] >> 비교대상 1의 x좌표, y좌표

         o2[0], o2[1] >> 비교대상 2의 x좌표, y좌표

 

이 Comparator의 역할이 바로 두 개의 인자를 받아서 비교 결과를 반환하는 것이다. 

반환값이 음수이면 o1이 o2보다 작다는 뜻이고

양수이면 o1이 o2보다 크다는 의미. 

 

그래서 if else 구문을 사용해 x좌표가 같으면 y좌표와 비교하여 반환값을 주고,

같지 않으면 x좌표 자체를 비교하여 반환값을 주어 정렬이 완성이 되는 것이다. 

 

 

** 다음에 Comparator와 Comparable에 대해 공부할 것!!

https://st-lab.tistory.com/243

728x90

BELATED ARTICLES

more