반응형
조합
조합이란?
- n개의 요소 중 r개의 항목을 뽑는 것을 말한다.
- 순서가 다르더라도 요소가 동일하게 뽑혔다면 같은 케이스로 간주한다.
- A, B → A, B, AB
코드
- result : 결과를 저장하는 셋
- temp : r개를 뽑는 결과 값을 저장하는 배열
- data : 요소 배열
- r : 뽑고자 하는 개수
- depth : 재귀 호출 깊이 값
- start : 다음 반복문의 시작 인덱스
- i + 1인 이유는 나왔던 값이 또 다시 반복되면 안되기 때문
class Solution {
public Set<String> solution(String data, int r) {
Set<String> result = new HashSet<>();
combination(result, new char[data.length()], data.toCharArray(), r, 0, 0);
return result;
}
private void combination(Set<String> result, char[] temp, char[] data, int r, int depth, int start) {
if (r == depth) {
result.add(IntStream.range(0, depth).mapToObj(i -> String.valueOf(temp[i])).collect(Collectors.joining()));
return;
}
for (int i = start; i < data.length; i++) {
temp[depth] = data[i];
combination(result, temp, data, r, depth + 1, i + 1);
}
}
}
class SolutionTest extends Specification {
@Unroll
def "#data, #r-> #result"() {
expect:
new Solution().solution(data as String, r as int) == result as Set<String>
where:
data | r | result
"ABC" | 1 | ["A", "B", "C"]
"ABC" | 2 | ["AB", "BC", "AC"]
"ABC" | 3 | ["ABC"]
}
}
중복 조합
중복 조합이란?
- 조합과 동일하나 이미 선택한 요소가 추가적으로 선택될 수 있다
- 조합 예시
- A, B → A, B, AB
- 중복 조합 예시
- A, B → A, B, AB, AA, BB
코드
- 조합 코드와 동일하고, start 값이 i + 1로 넘기던 부분을 i를 넘기도록 변경
- start 값이 i인 이유는 선택한 값을 또 선택 가능하기 때문
class Solution {
public Set<String> solution(String data, int r) {
Set<String> result = new HashSet<>();
combination(result, new char[data.length()], data.toCharArray(), r, 0, 0);
return result;
}
private void combination(Set<String> result, char[] temp, char[] data, int r, int depth, int start) {
if (r == depth) {
result.add(IntStream.range(0, depth).mapToObj(i -> String.valueOf(temp[i])).collect(Collectors.joining()));
return;
}
for (int i = start; i < data.length; i++) {
temp[depth] = data[i];
combination(result, temp, data, r, depth + 1, i);
}
}
}
class SolutionTest extends Specification {
@Unroll
def "#data, #r-> #result"() {
expect:
new Solution().solution(data as String, r as int) == result as Set<String>
where:
data | r | result
"ABC" | 1 | ["A", "B", "C"]
"ABC" | 2 | ["AA", "BB", "CC", "AB", "BC", "AC"]
"ABC" | 3 | ["AAA", "ABB", "ACC", "AAB", "ABC", "BBC", "CCC", "AAC", "BBB", "BCC"]
}
}
참고
반응형
'Development > Algorithm' 카테고리의 다른 글
[Algorithm] 크루스칼 알고리즘(Kruskal Algorithm) (0) | 2020.12.28 |
---|---|
[Algorithm] 합집합 찾기(Union-Find) (0) | 2020.12.28 |
[Algorithm] 순열(Permutation) (0) | 2020.12.28 |
[Algorithm] 깊이 우선 탐색(Depth First Search) (0) | 2020.12.28 |
[Algorithm] 너비 우선 탐색(Breath First Search) (0) | 2020.12.28 |