반응형
C++에서는 `bool`을 사용하고, Java에서는 `int`로 -1, 0, 1로 구분해서 사용하기 때문에, 혼동이 올 때가 많았습니다.
그래서 항상 헷갈리기에 정리해둔 것을 적어두겠습니다.
C++
오름차순 : `a < b` (갈수록 커진다!)
내림차순 : `a > b` (갈수록 작아진다!)
- 1차원 배열일 경우
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
int main() {
int arr[] = {5, 7, 2, 3, 6, 1, 4};
int size = 7;
// ---------------------------------------------------
// 오름차순
sort(arr, arr + 7, [](const auto& a, const auto& b) {
return a < b;
});
for (auto a: arr) cout << a << ' ';
cout << endl;
// 결과 : 1 2 3 4 5 6 7
// ---------------------------------------------------
// 내림차순
sort(arr, arr + 7, [](const auto& a, const auto& b) {
return a > b;
});
for (auto a: arr) cout << a << ' ';
cout << endl;
// 결과 : 7 6 5 4 3 2 1
return 0;
}
- `Pair<int,int>` 배열일 경우
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
int main() {
pair<int,int> arr[] = {{0, 4}, {3, 6}, {2, 1}, {3, 8}, {1, 2}};
int size = 5;
// ---------------------------------------------------
// first 기준 오름차순 (first가 같으면 second 오름차순)
sort(arr, arr + size, [](const auto& a, const auto& b) {
if (a.first == b.first) {
return a.second < b.second;
}
return a.first < b.first;
});
for (auto [x, y] : arr) {
cout << x << ' ' << y << endl;
}
// 결과
// 0 4
// 1 2
// 2 1
// 3 6
// 3 8
// ---------------------------------------------------
// second 기준 오름차순 (second가 같으면 first 오름차순)
sort(arr, arr + size, [](const auto& a, const auto& b) {
if (a.second == b.second) {
return a.first < b.first;
}
return a.second < b.second;
});
for (auto [x, y] : arr) {
cout << x << ' ' << y << endl;
}
// 결과
// 2 1
// 1 2
// 0 4
// 3 6
// 3 8
return 0;
}
JAVA
Comparator : 따로 클래스(분리)를 선언해서 `sort`나 `filter` 등에 사용한다.
Comparable : 사용하려는 데이터 클래스(자신)에 implement 해주면 다른 클래스에서 비교가 필요할 때 사용된다.
오버플로우를 방지하기 위해서 `Interger.compare()` 같은 메소드를 적극 사용해주자.
오름차순 : `a - b` (a에서 b 순서대로 간다!)
내림차순 : `b - a` (b에서 a 순서대로 간다!)
- 1차원 배열일 경우
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class Main {
private static class GreaterCompare implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return a - b; // 실제로는 Integer.compare(a, b) 를 사용해야 함
}
}
private static class LessCompare implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b - a; // 실제로는 Integer.compare(b, a) 를 사용해야 함
}
}
public static void main(String[] args) {
// List.of는 java 9부터 사용
List<Integer> list = new ArrayList<>(List.of(new Integer[]{2, 7, 5, 6, 3, 1, 9}));
// 오름차순
list.sort(new GreaterCompare());
list.forEach(System.out::print);
// 결과 : 1235679
// 내림차순
list.sort(new LessCompare());
list.forEach(System.out::print);
// 결과 : 9765321
}
}
- `Pair` 객체 배열일 경우
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Main {
private static class Pair implements Comparable<Pair> {
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Pair p) {
// x 기준 오름차순, x가 같으면 y 오름차순
if (this.x == p.x) {
return Integer.compare(this.y, p.y);
}
return Integer.compare(this.x, p.x);
// x 기준 내림차순은 Integer.compare(p.x, this.x);
}
}
public static void main(String[] args) {
List<Pair> pairList = new ArrayList<>();
pairList.add(new Pair(0, 4));
pairList.add(new Pair(3, 6));
pairList.add(new Pair(2, 1));
pairList.add(new Pair(3, 8));
pairList.add(new Pair(1, 2));
// 내부적으로 Comparable에 있는 compareTo를 이용하여 정렬
Collections.sort(pairList);
pairList.forEach(pair -> {
System.out.println(pair.x + " " + pair.y);
});
}
}