728x90
이번 정렬 문제는 조금 더 심화된 문제입니다.
정렬 조건 2개를 사용해야 하는 문제이고 2차원 배열도 사용해야하는 문제입니다.
제가 작성한 코드에서는 println()으로 출력하면 시간 초과가 떠서 BufferedWriter를 사용해서 풀었습니다.
package baekjoon.level12;
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class BOJ_11650 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Integer[][] position = new Integer[N][2];
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
position[i][0] = Integer.parseInt(st.nextToken());
position[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(position, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
if(o1[0].equals(o2[0])) {
return o1[1] - o2[1];
}else {
return o1[0] - o2[0];
}
}
});
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (Integer[] pos : position) {
bw.write(pos[0] + " " + pos[1] + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
2차원 배열을 만들고 StringTokenizer를 이용해서 각각의 좌표값을 넣어주었습니다.
좌표값이 들어간 배열을 Comparator로 정렬하면 끝입니다. (조건이 2개인 것만 조심하면 됩니다!!)
compare()의 매개변수인 o1, o2는 [1,1] [2,2]의 형식으로 출력됩니다.
우리는 x를 기준으로 오름차순으로 정렬하되, x값이 같으면 y를 기준으로 오름차순으로 정렬해야 합니다.
o1[0]은 첫 번째 배열의 x좌표이고, o2[0]은 두 번째 배열의 x좌표입니다.
이 두 값이 같으면 y좌표를 기준으로 정렬하도록 구현되어있는 것을 볼 수 있습니다.
만약 x좌표가 같지 않다면 x좌표를 기준으로 정렬하게 됩니다!!
저는 처음에는 출력을 System.out.println()을 사용해서 했는데 시간초과가 뜨더라구요 ㅠ
아마도 println()을 이용한 출력이 많은 성능을 요구하기 때문이라고 생각됩니다.
알고리즘 문제를 풀면서도 참 많은 것을 신경써야 하는 것 같습니다 ㅠㅠ
마지막으로 BufferedWriter와 Println()의 성능에 대한 것은 정리해서 포스팅 할 예정입니다!!
728x90
'Algorithms 🚀 > Baekjoon' 카테고리의 다른 글
[백준/10814번] 나이순 정렬 - JAVA[자바] (0) | 2021.04.13 |
---|---|
[백준/1181번] 단어 정렬 - JAVA[자바] (0) | 2021.04.13 |
[백준/1427번] 소트인사이드 - JAVA[자바] (0) | 2021.04.12 |
[백준/8958번] OX퀴즈 (0) | 2021.02.16 |
[백준/3052번] 나머지 (0) | 2021.02.02 |