티스토리 뷰
Solved.ac Class 완전정복 프로젝트
Class : 2 ~ 2 ++
링크
https://www.acmicpc.net/problem/11651
문제
2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 ii 번 점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
접근방법
y좌표를 기준으로 오름차순 정렬을 요구하는 문제이다. 단, y좌표가 같다면 x좌표를 기준으로 오름차순을 만드는 2차원 정렬이다. 이 문제 또한 정렬의 조건이 일반적이지 않은 특수한 정렬이다. 비교조건을 만들어 쓸 수도 있겠다는 생각을 가지고 풀이에 들어가자.
풀이
ArrayList에 1차원 배열을 담아 Collection객체의 sort를 이용하여 풀었다. 배열은 0인 덱스에 x 좌표, 1인 덱스에 y 좌표로 정의하였고, 정렬 조건은 다음과 같이 y값이 같은 경우에만 x로 2차 정렬을 시도하고 아닌 경우에는 y값에서 정렬을 시도한다.
자세한 방법은 아래의 더보기를 참고바란다.
아래의 블로거님 포스팅이 찾아본것 중 끝판왕이다. 이렇게 설명할 자신이 없으니, 참고 바란다.
Comparable과 Comparator에 관한 설명.
코드
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 {
Main test = new Main();
}
public Main() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer stk ;
int tc = Integer.parseInt(br.readLine());
List<int[]> datas = new ArrayList<>();
for (int i = 0; i < tc; i++) {
int[] info = new int[2];
stk = new StringTokenizer(br.readLine()," ");
info[0] = Integer.parseInt(stk.nextToken());
info[1] = Integer.parseInt(stk.nextToken());
datas.add(info);
}
solution(datas);
for (int[] data : datas){
for (int info : data){
sb.append(info+" ");
}
sb.append("\n");
}
System.out.println(sb);
}
//y를 기준으로 우선 정렬 후, 같을 경우에 한하여 2차정렬
public void solution( List<int[]> datas) {
Collections.sort(datas, (o1,o2)->{
if(o1[1] == o2[1]){
if(o1[0] < o2[0]){
return -1;
}else{
return 1;
}
}else{
return Integer.compare(o1[1],o2[1]);
}
});
}
}
결과
cf.) 비슷한 유형
포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.
더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.
읽어주셔서 감사합니다.
'공부 > 코딩 테스트 준비' 카테고리의 다른 글
[백준] 11050번 이항 계수 (0) | 2021.09.04 |
---|---|
[백준] 2869 - 달팽이는 올라가고 싶다 JAVA (0) | 2021.09.03 |
[백준] 10989 - 수 정렬하기 3 JAVA (0) | 2021.09.02 |
[백준] 10250 - ACM 호텔 JAVA (0) | 2021.09.01 |
[백준] 10814 - 나이순정렬 JAVA (0) | 2021.08.31 |
- Total
- Today
- Yesterday
- Database
- 카카오
- 브루트포스
- JNDI연동
- BFS
- db
- 프로그래머스
- looker core
- 9019
- 프로그래머스 문제정복
- 자바
- 유클리드-호제법
- 실패일기
- 아기상어나쁜상어
- 코딩테스트
- value annotation
- 아기상어미워
- 플루이드 와샬
- looker instance 접속
- 백준
- dml
- 재귀
- DFS
- 하루 회고
- Python
- 그래프 탐색
- Spring
- 파이썬
- DP
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |