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는 안 바뀌는 것처럼 보이는 건 오해!" → 사실은 행 전체가 이동하는 거야