문제출처 : https://www.acmicpc.net/problem/1182


1. 문제요약

- 집합, N개의 원소, 부분집합의 합이 S를 만족시키는 경우의 수

- N < 20, lSl < 1,000,000, l원소l < 100,000

- 공집합은 제외


2. 접근방법

- 부분집합의 개수는 2^N = 2^20 ≒ 1억번 ≒ 1초

- 모든 부분집합의 합을 다 구해보면 된다.


3. 시간복잡도

- 재귀 : 2^N => 테스트 결과 4ms

- Bit Mask : 2^N * N => 테스트 결과 52ms


4. 회고

- 재귀로 구현했을 때

  : 공집합인지 확인하는 과정이 필요함. S의 값이 0인 경우 공집합의 합은 0 이므로

  : 처음에는 선택한 원소의 개수도 재귀로 넘겼는데 S가 0이 아닌 경우는 공집합을 포함해도 경우의 수에 포함 되지 않으므로 

   마지막에 계산할 때, S가 0인 경우 1가지 경우의 수를 빼주면 됨.


- Bit Mask로 구현했을 때

  : 좀 더 구현에 연습이 필요함



재귀 소스코드


Bit Mask 소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 1966 프린터 큐  (0) 2017.12.26
BOJ 7568 덩치  (0) 2017.12.19
BOJ 6603 로또  (0) 2017.12.19
BOJ 2309 일곱난쟁이  (0) 2017.12.13
BOJ 1065 한수  (0) 2017.12.12

문제출처 : https://www.acmicpc.net/problem/2309


1. 문제요약

- 9명의 난쟁이 중 키의 합이 100이 되는 7명의 난쟁이를 뽑아 오름차순으로 출력


2. 접근방법

- 단순하게 9명 중 7명을 뽑아서 키의 합이 100이 되면 출력 후 종료 => 조합 9C7

- 9C7 = 9C2 이므로 9명의 총 합에서 100을 제외한 값을 만족하는 2명만 뽑아서 나머지를 출력


3. 시간복잡도

- 9C7 재귀 구현의 경우 O(2^N) = 2^9

- 9C2 for 구현의 경우 O(NC2) = 9C2 => for를 계산해보면 8 + 7 + 6 + 5 + ... + 2 + 1 = 36


4. 회고

- 9C7을 재귀로 구현했을 때

  재귀에서 '정답인 경우'와 '정답이 아닌 경우'를 잘못 선정해서 무한루프에...

  base case를 잘 생각해보자

- 조합을 재귀 말고 쉽게 구현할 수 있는 방법이 있을까? 아직 지하 밑바닥에 있어서 좀 더 경험이 필요할 듯


- 9C2를 for로 구현했을 때 sort에서 a+10을 해버렸....왜 0이 나오나 했네



소스코드 : 9C2




[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 1966 프린터 큐  (0) 2017.12.26
BOJ 7568 덩치  (0) 2017.12.19
BOJ 6603 로또  (0) 2017.12.19
BOJ 1182 부분집합의 합  (0) 2017.12.16
BOJ 1065 한수  (0) 2017.12.12

오늘도 여전히 줍줍


std::ios::sync_with_stdio(false)


cout << ... << "\n";


http://gooddaytocode.blogspot.kr/2016/07/cin-scanf.html


https://algospot.com/forum/read/2496/


https://www.acmicpc.net/board/view/20309

+ Recent posts