-
[알고리즘 정리] 조합, 부분 집합 구현Development/Algorithm 2020. 5. 3. 20:18
다룰 내용
- 조합이란 무엇인가?
- 조합 구현
- 부분 집합이란 무엇인가?
- 부분 집합 구현
조합이란 무엇인가?
순서의 의미가 없이 수를 나열하는 것으로, 순열의 경우 순서가 의미가 있으나 조합은 의미가 없습니다.
조합을 구현하는 방법
- 현재 자리에서 조합할 수를 선택합니다.
조합 구현 첫 번째 방법
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Combination { public static int N, R; public static int origin[], number[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input[] = br.readLine().split(" "); N = Integer.parseInt(input[0]); R = Integer.parseInt(input[1]); origin = new int[N]; number = new int[R]; String input2[] = br.readLine().split(" "); for(int i = 0; i < N; i++){ origin[i] = Integer.parseInt(input2[i]); } combination(0, 0); } // 현재 위치에 조합할 수 선택 private static void combination(int cnt, int idx) { if(cnt == R) { System.out.println(Arrays.toString(number)); return; } for(int i = idx; i < N; i++) { number[cnt] = origin[i]; combination(cnt + 1, i + 1); } } }
조합 구현 두 번째 방법
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Combination2 { public static int N, R; public static int origin[], number[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input[] = br.readLine().split(" "); N = Integer.parseInt(input[0]); R = Integer.parseInt(input[1]); origin = new int[N]; number = new int[R]; String input2[] = br.readLine().split(" "); for(int i = 0; i < N; i++){ origin[i] = Integer.parseInt(input2[i]); } combination(0, 0); } // 현재 위치에 조합할 수 선택 private static void combination(int cnt, int idx) { if(cnt == R) { System.out.println(Arrays.toString(number)); return; } if(idx >= N) return; number[cnt] = origin[idx]; combination(cnt + 1, idx + 1); combination(cnt, idx + 1); } }
두 번째 방법은 현 위치에서 현재 원소를 선택하는 경우와 선택하지 않는 경우를 다 시도해보는 방법입니다.
부분 집합이란 무엇인가?
어떤 집합에 대해서 원소를 부분적으로만 가지는 것을 말합니다. 아무것도 가지지 않는 경우부터 모두 다 갖는 경우도 포함될 수 있습니다.
부분 집합을 구하는 방법
- 처리하는 원소를 선택하는 경우와 선택하지 않는 경우로 나눠서 집합에 넣는 방식으로 구할 수 있습니다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Subset { public static int N, origin[]; public static boolean isSelected[]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine()); origin = new int[N]; isSelected = new boolean[N]; String input2[] = br.readLine().split(" "); for(int i = 0; i < N; i++){ origin[i] = Integer.parseInt(input2[i]); } subset(0); } private static void subset(int cnt) { if(cnt == N) { for(int i = 0; i < N; i++) { System.out.print((isSelected[i] ? origin[i] : "X") + " "); } System.out.println(); return; } isSelected[cnt] = true; subset(cnt + 1); isSelected[cnt] = false; subset(cnt + 1); } }
'Development > Algorithm' 카테고리의 다른 글
[알고리즘 정리] Dijkstra(다익스트라) (0) 2020.05.03 [알고리즘 정리] Kruskal & Prim(크루스칼과 프림) (0) 2020.05.03 [알고리즘 정리] Union-Find(유니온 파인드) (0) 2020.05.03 [알고리즘 정리] 순열, next_permutation 구현 (0) 2020.04.29 [알고리즘 정리] 재귀 (0) 2020.04.08