[JAVA] 백준 11650번 - 좌표 정렬하기_람다식

닥개·2025년 3월 27일

공부

목록 보기
12/23

11650번 - 좌표 정렬하기

풀이만 가능한 내 코드

아래 코드로는 정답은 나오지만 백준에서 정답은 아닌 코드임
다른 코드들을 보니 람다식을 사용하여, 람다식을 공부 후 적용

// 좌표 정렬하기 - 정렬

import java.util.Scanner;
import java.util.Arrays;
//import java.util.Comparator;

public class A_11650 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int a[][] = new int[N][2];
        //-100,000 < x < 100,000 
        
        for(int i=0;i<N;i++){
            a[i][0] = sc.nextInt();
            a[i][1] = sc.nextInt();
        }
        sc.close();

        int cnt[] = new int[N];
        int cnty[] = new int[N];
        int small,y,sumo;
        int q=0;

        while(q<N){
            small = 100000;
            y=0; sumo=0;
            Arrays.fill(cnty, 0);

            for(int k=0;k<N;k++){
                if(small>a[k][0] && cnt[k]<1){
                    small = a[k][0];
                }
            }
            for(int j=0;j<N;j++){
                if(a[j][0]==small){
                    if(a[j][1]==0) sumo++;
                    cnty[y]= a[j][1];
                    y++;
                    cnt[j]++;
                    q++;
                }
            }

                if(y>1){
                    Arrays.sort(cnty);

                    for(int i=0;i<N;i++){
                        if(y==0) continue;
                        if(cnty[i]==0) {
                            if(sumo>0){
                                System.out.println(small+" "+cnty[i]);
                                sumo--;
                            }
                        }
                        else{
                            System.out.println(small+" "+cnty[i]);
                            y--;
                        }
                    }

                    }
                    else{
                        System.out.println(small +" " + cnty[0]);

                    }           
        }

    }
}

람다식

람다식 https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95
지연연산 https://bugoverdose.github.io/development/stream-lazy-evaluation/

람다의 특징: 익명함수
코드의 길이를 줄임
코드의 간결성: 불필요한 반복문의 삭제, 단순한 표현 가능
지연연산 수행으로 불필요한 연산 최소
지연연산이란? (Lazy Evaluation)
결과값이 필요할 때 까지 계산을 늦추는 기법( 실행결과가 필요한 시점에 수행-- 그러므로 ~ 내부적으로 준비하는 작업이 필요하며 효육적인 방식이라고 보기는 어렵다)
<->반대: 즉시수행 (Eager) : 특정작업의 실행결과가 확실히 필요하다면 미리 실행해놓는것이 성능측면에서 우월할 것
단점: 람다식 호출이 까다로움, 람다 stream 사용 시 단순 for 혹은 while문 사용 시 성능이 떨어짐
많이 사용하면 가독성 저하



람다의 표현식

1) 매개변수 화살표로 함수 몸체로 이용
2) 단일 실행문이면 {} 생략
3) 단, 함수몸체가 return 문으로만 구성되어있으면 {} 생략불가
4) 매개변수가 하나라면 () 생략가능

() -> {}
() -> 1


(int x) -> x+1
(x) -> x+1
x -> x+1
x -> { return x+1 }

import java.util.Scanner;
import java.util.Arrays;

public class A_11650 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] a = new int[N][2];

        for (int i = 0; i < N; i++) {
            a[i][0] = sc.nextInt();
            a[i][1] = sc.nextInt();
        }
        sc.close();

//arrays.sort 정렬
        Arrays.sort(a, (o1, o2) -> {
            if (o1[0] == o2[0]) return Integer.compare(o1[1], o2[1]); // x 좌표 같으면 y 정렬
            return Integer.compare(o1[0], o2[0]); // x 좌표 기준 정렬
        });

//sb출력으로 출력시간 감소
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            sb.append(a[i][0]).append(" ").append(a[i][1]).append("\n");
        }
        System.out.print(sb);
    }
}

❓ 여기서 arrays.sort를 사용하며 궁금했던 점!
[1]에 해당하는 y좌표는 x좌표의 정렬을 따라가지 않는가?

1) Arrays.sort()는 배열의 "행" 단위로 정렬함 → 즉, x 값이 이동하면 y 값도 자동으로 따라감
2) x 기준 정렬 후, x가 같을 경우 y 기준 정렬하면 완벽한 정렬이 가능
3) "x만 바뀌고 y는 안 바뀌는 것처럼 보이는 건 오해!" → 사실은 행 전체가 이동하는 거야

    	
profile
발바닥부터 시작하는 코딩공부

0개의 댓글