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() |