티스토리 뷰
Recursion으로 먹집합을 구성해보겠습니다.
멱집합이란? 모든 부분 집합을 모은 집합을 의미합니다.
멱집합 A가 존재한다고 할 때 A을 나타내는 기호는 P(A) 나 이다. 예를 들어, { A={1,2}} A = {1, 2} 의 멱집합은 P(A) = {공집합, {1}, {2}, {1,2}} 이다.
멱집합의 특징을 고려해서 다음과 같이 규칙을 만들 수 있습니다.
규칙 1. 부분집함을 구성 시 부분집합의 각 요소는 포함 하는 경우와 포함하지 않는 경우로 나눈다.
규칙 2. 공집합도 집합으로 구분되며, P(A)는 2^A이다.
규칙 1을 그래프로 표시하면 다음과 같이 표시할 수 있습니다.
각 원소의 포함 여부를 저장하는 boolean[] 을 구성합니다.
boolean[] hasThis;
그래프 구성은 가장 위에는 공집합을 의미하며 위에서부터 하나씩 각 원소로 생각하면 이해하기 쉬울 것입니다.
위에서 아래로 내려가면서 나눠지는데 왼쪽은 포함하지 않은, 오른쪽은 포함을 표시합니다.
이것을 소스로 표현 하면 현재 포함 여부를 boolean 값으로 표시 후 다음 행 실행으로 진행합니다.
hasThis[position] = true;
checkUp(position + 1);
hasThis[position] = false;
checkUp(position + 1);
가장 하단(각 원소들의 끝에 행)으로 왔을 시 포함된 부분의 원소만 보여주면 멱집합을 그릴 수 있습니다.
멱집합 구하는 전체 소스를 살펴보겠습니다.
Day001.java
public class Day001 {
static boolean[] hasThis;
static char[] datas = new char[] {'a', 'b', 'c', 'd','e'};
// 먹집합 알고리즘
// 먹집합 알고리즘은 2^n을 값을 갖고있다.
// 자신을 포함하는 경우와 포함하지 않는 경우로 나눠진다.
private static void checkUp(int position) {
if (position == hasThis.length - 1) {
System.out.print("{");
int pos = 0;
for (boolean hThis : hasThis) {
if (hThis) {
System.out.print(datas[pos]);
}
pos++;
}
System.out.print("}");
return;
}
hasThis[position] = true;
checkUp(position + 1);
hasThis[position] = false;
checkUp(position + 1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
hasThis = new boolean[3];
checkUp(0);
}
}
마무리
멱집합에 대해서 개념을 알고 있으니 풀이까지 해보는 것은 처음이었습니다.
멱집합 같은 포함, 불포함에 따른 그래프 표시가 가능한 문제 같은 경우는 boolean[]을 만들어 접근하면 보다 쉽게 문제를 해결할 수 있습니다.
'프로그래밍 > Algrism' 카테고리의 다른 글
[Algorism] 합병정렬(Merge Sort) (0) | 2019.04.18 |
---|---|
[알고리즘] 간단한 정렬 알고리즘(Bubble, Insertion, Selection) (0) | 2019.03.29 |
미로찾기(Decision Problem) 에 대해서 알아보자 (0) | 2019.01.06 |
- view
- issue
- 안드로이드
- 디자인패턴
- DI
- Kotlin
- 알고리즘
- 고시문
- IT
- 미션차이나센터
- 고시문헬퍼
- 스코어헬퍼
- 패턴
- 선교
- flutter
- 탁구
- push
- IOS
- 코틀린
- Android Studio
- Android
- java
- RXjava
- 임용고시
- swift
- missioon
- MCC
- missionchina
- 점수판
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |