on my way

[GDSC Week3-2] 백준 1182번:: 부분수열의 합 (C++) 본문

algorithm/C++

[GDSC Week3-2] 백준 1182번:: 부분수열의 합 (C++)

wingbeat 2021. 10. 24. 22:46
반응형

* 생각한 아이디어 및 문제 풀이

수 하나를 더할 때 마다 답이 아니면 처음부터 진행하는 것이 아닌, 그 수를 빼고 다른 수를 더해 확인하는 백트래킹 방식을 사용하여 재귀함수 형식으로 문제를 풀이한다.
주의할 점은 sum이 해당하는 값에 도달하더라도 뒤의 것을 계속해서 탐색해야한다는 것이다.

 

* 코드

#include <iostream>
using namespace std;

int arr[21];
int N, S, cnt=0;

void backTracking(int start, int sum) {
	if (start >= N) return;
	int tmp = sum;
	tmp += arr[start];
	if (tmp == S) cnt++;
	for (int i=start+1; i<N; i++){
		backTracking(i, tmp);
	}
}

int main() {
	ios::sync_with_stdio(false); 
	cin.tie(NULL);
    
	int tmp;
	cin >> N >> S; 
	for (int i=0; i<N; i++){
	    cin >> arr[i];
	}
	
	for (int i=0; i<N; i++) {
		tmp = 0;
		backTracking(i, tmp);
	}
    cout << cnt;
}

 

* 회고

 

 

* 문제 링크 : https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

https://velog.io/@ynoolee/BackTracking%EB%B0%B1%EC%A4%801182%EB%B2%88

 

BackTracking_백준1182번

부분수열에 속한 원소를 모두 합한 것이 S가 되는 부분수열의 개수를 출력.부분 수열이라는 것은 결국, 어떤 시작점부터 어떤 끝점까지 연속한 원소들의 집합.전체 탐색을 해야하는가? 시간제한

velog.io

 

반응형