본문 바로가기

카테고리 없음

260125 조합,순열 / 객체다중정렬 / 우선순위큐

728x90

<!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}-->

2026.01.25
1. 조합 (Combination, nCr)
- 의미: n개 중에서 r개를 "뽑기만" 할 때 (순서 상관없음)
- 특징: 순열보다 값이 작음 (나누기를 하니까)
- 공식 패턴: (n부터 1씩 줄여가며 r개 곱하기) / (r부터 1까지 곱하기)

[2개 뽑을 때 (nC2)]
결과 = (n * (n-1)) / 2

[3개 뽑을 때 (nC3)]
결과 = (n * (n-1) * (n-2)) / (3 * 2 * 1)

[4개 뽑을 때 (nC4)]
결과 = (n * (n-1) * (n-2) * (n-3)) / (4 * 3 * 2 * 1)


2. 순열 (Permutation, nPr)
- 의미: n개 중에서 r개를 뽑아서 "나열(줄세우기)" 할 때 (순서 중요)
- 특징: 조합보다 값이 큼 (나누기가 없음)
- 공식 패턴: n부터 1씩 줄여가며 r개 곱하기 (분모 없음!)

[2개 줄세울 때 (nP2)]
결과 = n * (n-1)

[3개 줄세울 때 (nP3)]
결과 = n * (n-1) * (n-2)

[4개 줄세울 때 (nP4)]
결과 = n * (n-1) * (n-2) * (n-3)
 
객체의 정렬 2가지 방법과 람다 정렬법
class Node implements Comparable<Node> {
int value;

@Override
public int compareTo(Node o) {
// 오름차순: 나 - 쟤
return Integer.compare(this.value, o.value);
}
}

// 상황: 점수(score) 내림차순, 같으면 이름(name) 오름차순
Collections.sort(list, (o1, o2) -> {
// 1. 점수가 다르면? (내림차순: 쟤 - 나)
if (o1.score != o2.score) {
return Integer.compare(o2.score, o1.score);
}
// 2. 점수가 같으면? (이름 오름차순)
return o1.name.compareTo(o2.name);
});

// 한 줄일 때: 중괄호, return 생략 가능
(o1, o2) -> o1.age - o2.age

// 여러 줄일 때: 중괄호 { } 필수, return 필수!
(o1, o2) -> {
if (o1.age > o2.age) return 1;
return -1;
}
 
우선순위 큐 외울 것
PriorityQueue<Integer> minPq = new PriorityQueue<>();

만약 큰 값 부터 뽑고 싶은 경우??
// 반대 (최대 힙): 100, 99, 98... (이거 자주 씀!)
PriorityQueue<Integer> maxPq = new PriorityQueue<>(Collections.reverseOrder());
요약: offer(), poll(), peek(), isEmpty(), Collections.reverseOrder()