알고리즘
[백준] 11650번 : 좌표 정렬하기 _ JAVA ( 주석 설명 ) 본문
더보기
처음 문제를 보고 접근했을 때 Dictionary, 자바에서 Map 자료구조를 생각하고 접근했으나,
Map 에서는 key 값이 중복이 안된다는 것을 깨닫고 포기했다. ( 물론 찾아보니 MultiValueMap 도 있었지만, 문제의 의도는 이게 아닌 것 같아.. )
다음은 저번에 학습했던 Counting 배열로 풀어볼까 했다.
아니나 다를까 x,y 좌표의 x,y <= |100,000| 이라는 넓은 입력값의 범위에 메모리 초과가 나 실행조차 되지 않았다.
1시간 동안 고민한 끝에, '다른 분이 작성하신 코드를 보고 배우자'
왠 걸, 최근에 자바를 복습하면서 봤던 "람다"를 사용해서 푸는 것이었다.
다음 아래에서 그 풀이를 확인해 볼 수 있다.
1번
→ Arrays.sort(T[] a, Comparator<? super T> c) 에서
Comparator 의 compare 를 재정의 함으로써 원하는 정렬을 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 입력을 위해 버퍼를 이용해 입력을 받는다.
StringTokenizer st;
StringBuilder sb = new StringBuilder(); //출력을 조금 더 빠르게 하기 위함
int N = Integer.parseInt(br.readLine()); //점의 개수를 입력받는다.
int[][] ary = new int[N][2]; //점의 개수만큼의 행 공간을 생성하고, 열 공간은 x∙y 좌표를 넣으므로 2로 설정한다.
for(int i=0;i<N;++i){
st = new StringTokenizer(br.readLine()); //개행을 하면 소모되는 객체로서 개행을 할 때마다 다시 정의해준다.
int x = Integer.parseInt(st.nextToken()); //x좌표를 입력받는다.
int y = Integer.parseInt(st.nextToken()); //y좌표를 입력받는다.
//행은 좌표가 입력되는 순서를 열은 0,1 열에 x,y 좌표값을 넣는다.
ary[i][0] = x;
ary[i][1] = y;
}
Arrays.sort(ary, (a,b) -> {
if(a[0] == b[0]){ //x좌표가 같으면 y좌표를 비교하여 오름차순으로 정렬한다.
return a[1] - b[1];
}
else //x좌표가 다르면 x좌표를 우선으로 비교하여 오름차순으로 정렬한다.
return a[0] - b[0];
});
for(int i=0;i<N;++i){ //x좌표를 중심으로 정렬한 배열을 StringBuilder에 넣어준다.
sb.append(ary[i][0] + " " + ary[i][1]).append('\n');
}
System.out.println(sb); //결과값을 출력한다.
}
}
'백준 - JAVA > 정렬' 카테고리의 다른 글
[백준] 1181번 : 단어 정렬 _ JAVA ( 주석 설명 ) (0) | 2023.02.09 |
---|---|
[백준] 11651번 : 좌표 정렬하기 2 _ JAVA ( 주석 설명 ) (0) | 2023.02.09 |
[백준] 1427번 : 소트인사이드 _ JAVA ( 주석 설명 ) (0) | 2023.02.07 |
[백준] 2108번 : 통계학 _ JAVA ( 주석 설명 ) (0) | 2023.02.07 |
[백준] 10989번 : 수 정렬하기 3 _ JAVA ( 주석 설명 ) (0) | 2023.02.07 |