반응형

처음에는 Arrays.sort()에 Comparator.comparingInt()를 이용해서 비교할 수 있다기에 람다식을 이용해 비교해봤었다.
❗️❗️ 틀린 코드
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));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][2];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
for(int i=0; i<N; i++){
if(Arrays.deepEquals(arr, arr)){
Arrays.sort(arr, Comparator.comparingInt(num2 -> num2[1]));
}
sb.append(arr[i][0] + " ");
sb.append(arr[i][1] + "\n");
}
System.out.println(sb);
}
}
이런 식으로 풀었는데 시간초과 문제가 발생하였다... 최대한 시간을 짧게 하려고 StringBuilder도 사용했는데..
다른 방법을 찾아보다가 이 글을 발견했다.
https://ifuwanna.tistory.com/328
[Java] 2차원 배열 정렬 (오름차순, 내림차순, 다중 조건)
> 2차원 배열을 오름차순, 내림차순, 이외에 원하는 조건 등 여러가지 방법으로 정렬 하는 방법을 포스팅 합니다. 2차원 배열을 바로 Arrray.sort()를 통해 정렬하려고 하면 java.lang.ClassCastException: I ca
ifuwanna.tistory.com
이 글에서 설명하는 두 가지 방식을 이용해 문제를 해결했다.
Comparator 익명 클래스 구현을 사용한 방법
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));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][2];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
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];
}
}
});
for(int i=0; i<N; i++){
sb.append(arr[i][0] + " ");
sb.append(arr[i][1] + "\n");
}
System.out.println(sb);
}
}
Arrays.sort()에 Lambda 를 사용한 방법
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));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][2];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, (e1, e2)->{
if(e1[0] == e2[0]){
return e1[1] - e2[1];
}else{
return e1[0] - e2[0];
}
});
for(int i=0; i<N; i++){
sb.append(arr[i][0] + " ");
sb.append(arr[i][1] + "\n");
}
System.out.println(sb);
}
}
처음 이 문제를 접할 땐 되게 간단하게 생각했는데 생각보다 그렇게 간단한 문제는 아니었다...
반응형
'알고리즘 > 백준' 카테고리의 다른 글
| [백준] 1181 - 단어 정렬 (JAVA/ 자바) (1) | 2024.06.13 |
|---|---|
| [백준] 11651 - 좌표 정렬하기 2 (JAVA/ 자바) (0) | 2024.06.11 |
| [백준] 1427 - 소트인사이드 (JAVA/ 자바) (0) | 2024.06.07 |
| [백준] 10989 - 수 정렬하기 3 (JAVA/ 자바) (1) | 2024.06.06 |
| [백준] 2751 - 수 정렬하기 2 (JAVA/ 자바) (0) | 2024.06.01 |