출처 핀터레스트
추석이다.. 아고 언제 내려가나..
문제 하나 풀어보았다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Test11650 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
Location[] locations = new Location[N];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
locations[i] = new Location(x, y);
}
Arrays.sort(locations);
for(Location loc : locations) {
sb.append(loc.x).append(" ").append(loc.y).append("\n");
}
System.out.print(sb);
}
static class Location implements Comparable<Location>{
private final int x;
private final int y;
Location(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Location location) {
//만약 기존 x좌표가 새로운 x좌표보다 작으면 뒤로감 -1 0 1
if(this.x < location.x) {
return -1;
} else if(this.x == location.x) {
//만약 x는 같은데 기존 y좌표가 새로운 y좌표보다 작으면 뒤로감 -1 0 1
if(this.y < location.y) {
return -1;
}
//앞으로 감
return 1;
}
//앞으로 감
return 1;
}
}
}
답안을 보니까 2차원 배열을 쓰는 것을 보았다.
나같은 경우 모델 클래스를 만들고,
클래스에 비교할 수 있는 인터페이스인
Comparable을 구현하였다.
Comaparable로 커스텀하여 정렬값을 구현하게 되면,
해당 클래스를 정렬(Arrays.sort())할때
compareTo() 메서드에 정의된 형태로 정렬이 되는 형식이다.
2차원 배열로 구현 할 때는
Array.sort() 메서드에서 람다로 구현하더라..
그게 더 간결해보이기도 해서 이런 방법도 있구나 하고 참고하였다.
람다식은 다음과 같다.
Arrays.sort(locations, (e1, e2) -> {
if(e1.x < e2.x) {
return -1;
} else if(e1.x == e2.x) {
//만약 x는 같은데 기존 y좌표가 새로운 y좌표보다 작으면 뒤로감 -1 0 1
if(e1.y < e2.y) {
return -1;
}
//앞으로 감
return 1;
}
//앞으로 감
return 1;
});
2차원 배열로 만들고,
클래스를 굳이 만들지 않아도 다음과 같이 식을 구현할 수 있었다.
하지만, 효율은 내 방법이 더 속도가 빨라서 기분이 좋았다 ㅎㅎ
여러 방법도 배워보자!!