백준알고리즘:p11650, p11651 좌표 정렬하기
분류: 정렬
▶문제
comparator를 이용해서 풀었다.
comparator를 쓰려면 compare 메소드를 오버라이드 해줘야 한다.
-comparator 인터페이스를 쓰는 경우 : 정렬 대상 클래스의 코드를 직접 수정할 수 없는 경우
-또는, 객체에 이미 존재하고 있는 정렬 기준과 다른 정렬 기준으로 정렬할 경우
▶코드
//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨
package sort;
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 p11650 {
//좌표정렬 comparator을 람다식 없이.
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
for(int i=0; i<n; i++) {
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];}
}
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++) {
sb.append(arr[i][0]+" "+arr[i][1]+"\n");
}
System.out.print(sb);
}
}
▶람다식으로 해보기
package sort;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class p11650_1 {
//좌표정렬 comparator을 람다식으로
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
for(int i=0; i<n; i++) {
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];
}
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++) {
sb.append(arr[i][0]+" "+arr[i][1]+"\n");
}
System.out.print(sb);
}
}
위와 같은 식으로 풀면 되는 11651번 문제를 같이 풀어봤다. 이번엔 y값를 먼저 오름차순 한 후, y값이 같을 때 x값을 오름차순으로 정렬해줘야 한다. (람다식 부분만 좀 다르니 살펴보자)
package sort;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class p11651 {
//좌표 정렬하기-11650과는 다르게 y오름차순 정렬+y같으면 x가 오름차순되게 정렬
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
for(int i=0; i<n; i++) {
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[1]==e2[1]) {
return e1[0]-e2[0];//y가 같을때만 x오름차순
}
else return e1[1]-e2[1];//일단 y오름차순 양수:우선순위큼 0:같음 음수:우선순위낮음
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++) {
sb.append(arr[i][0]+" "+arr[i][1]+"\n");
}
System.out.print(sb);
}
}
람다식이 생소하긴 했지만 아래 블로그를 보고 공부해봤다. 간단하게 함수를 쓸 일이 있을 때 좋을 것 같다.
또 comparator과 더불어 comparable도 같이 공부를 했는데 아래 블로그를 보고 참고해서 공부했다.
www.daleseo.com/java-comparable-comparator/
내가 다시 정리한 후 아래에 링크를 달아놔야겠다.
채점결과
링크 www.acmicpc.net/problem/11650
11650번: 좌표 정렬하기
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
www.acmicpc.net