근 며칠간 많이 애를 먹었따.
아직 완벽히 체득하지는 못한것 같지만 어느정도 이해했기에 기록용으로 남겨본다.
https://st-lab.tistory.com/110#%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
[백준] 11650번 : 좌표 정렬하기 - JAVA [자바]
www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항
st-lab.tistory.com
압도적 감사를 표한다.

시작은 이문제였다.
문제 보자마자 오호라, 앞에서 했던 소트 매서드를 구현해서 해야겠다.!!
버블소트로 구현했더니,
package sort;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Q6 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arrX = new int[N];
int[] arrY = new int[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arrX[i] = Integer.parseInt(st.nextToken());
arrY[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < N - 1; i++) {
for (int j = i; j < N - i - 1; j++) {
if (arrX[j] > arrX[j + 1]) {
swap(arrX, j, j + 1);
swap(arrY, j, j + 1);
}
}
}
for (int i = 0; i < N - 1; i++) {
for (int j = i; j < N - i - 1; j++) {
if (arrX[j] == arrX[j + 1]) {
if (arrY[j] > arrY[j + 1]) {
swap(arrX, j, j + 1);
swap(arrY, j, j + 1);
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
sb.append(arrX[i]).append(' ').append(arrY[i]).append("\n");
}
System.out.println(sb);
}
public static void swap(int[] arr, int idxA, int idxB) {
int temp = arr[idxA];
arr[idxA] = arr[idxB];
arr[idxB]=temp;
}
}
아니나 다를까, 시간 초과가 떴다. 도저히 어떻게 풀어야할지 모르겠어서 서칭을 했더니,
Arrays.sort 함수를 new Comparator 를 사용해서 발전시킬 수 있었다.

허허,,,,이런게 있었다니;; 진짜 어이가없었다.
return해주는게 저게 뭐야?하고 한참을 생각했었는데, 그냥 함수라고 생각하고 그냥 기능해주는거구나 하고 받아들였따.
return값이 기본적으로 양수일경우 Arrays.sort()에서 정렬 알고리즘에 의해 위치를 바꾸고, 0 이나 음의 정수인 경우는 두 객체의 위치는 바뀌지 않는다.
예로들어 { 2, 1, 3 } 이라는 배열이 있고, public int compare(int a1, int a2) { return a1 - a2 } 가 있다고 가정해보자.
그렇다면 맨 처음 a1 은 2 가 될테고, a2 는 1이 된다. 즉, 2 - 1 = 1 이므로 양수가 반환되기 때문에 a1 과 a2, 즉 2 와 1 의 위치가 서로 바뀌게 된다. 그러면 { 1, 2, 3 } 이 되겠다.
그 다음 a1, a2 는 각각 2 와 3이 될테고, 2 - 3 = -1 이므로 음수가 반환되어 두 객체 2와 3은 위치가 바뀌지 않는다.
이렇게 compare 메소드는 3가지 반환값에 의해 두 객체(인자)의 우선순위를 판단하고, 이를 정렬알고리즘 안에서 위치를 바꾸거나 그대로 둔다.
엄청난 설명이다.
그저 특별한 기준으로 오름차순!!----> Comparator내부의 compare매소드를 오버라이딩 해주는것,
이 문제는 이중 배열을 사용해서 각 행마다 좌표를 저장해주고,
그 좌표를 행 별로 열을 비교해서 정렬을 해줘야한다.
1.행 오름차순 정렬.
2.열 오름차순 정렬.
두 번 사용되어야하므로 특수 상황!
https://st-lab.tistory.com/243
자바 [JAVA] - Comparable 과 Comparator의 이해
아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객
st-lab.tistory.com
너무 정리가 잘 된 글이라서,,,, 앞으로도 헷갈리면 찾아볼 예쩡.

이 문제는 생각하기에는 조금 더 쉬웠다.
하지만 compareTo를 활용하는 법과 중복된 문자열을 제거해주는 것을 생각하는것이 애를 먹었다.
compareTo는 문자열을 서로 비교해서 얼마나 차이가 나는지 양수, 음수,0으로 리턴해준다.(차이만큼)
사전 순서대로 정렬한다!

허허
아주 끝내주는군,,

마지막으로 중복을 제거해주는 방법. 0번째꺼 넣어주고 1번째부터 비교
앞으로도 모르는게 더 많이 나오겠군,,,,
'백준' 카테고리의 다른 글
| [백준]1620: 자바-나는야 포켓몬마스터!!!!우하하하하하음하하하하!!! (1) | 2025.01.15 |
|---|---|
| 소수 찾기-에라토스테네스-백준 17103 (0) | 2025.01.14 |
| 최대공약수, 최소공배수 (0) | 2025.01.11 |
| StringBuilder, BufferedReader, StringTokenizer (1) | 2024.11.18 |
| Integer.parseInt (0) | 2024.11.17 |