Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- 백트래킹
- DP
- BFS
- 해시
- greedy
- broadcast
- boj
- 너비우선탐색
- 깊이우선탐색
- HashMap
- 이분탐색
- Spring
- 동적계획법
- Network
- Backtracking
- DFS
- 스프링
- 네트워크
- DynamicProgramming
- 해시맵
- programmers
- dynamic programming
- 백준
- 프로그래머스
- 그리디
- 브루트포스
- Algorithm
- 구현
- switch
Archives
- Today
- Total
옌의 로그
[Algorithm] 백준 - 부분수열의 합 (1182번) 본문
문제
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
사용 알고리즘
- 백트래킹(Backtracking)
해결방법
- 문제 자체는, 주어진 수열에서 모든 부분 수열을 확인하면 되는 문제이다.
- 모든 부분 수열을 어떻게 확인할건데 ?? >> 백트래킹을 사용해보자
- 백트래킹 알고리즘의 핵심은 '해를 찾는 도중에 막히면 되돌아가서 다른 경로를 탐색한다' 이다.
- 문제 예제1을 살펴보면, 다음과 같다
더보기-- 주어진 수열
[-7, -3, -2, 5, 8]
-- 호출순서
1. generateSubsequences([-7, -3, -2, 5, 8], [], 0)
2. generateSubsequences([-7, -3, -2, 5, 8], [], 1)
3. generateSubsequences([-7, -3, -2, 5, 8], [], 2)
4. generateSubsequences([-7, -3, -2, 5, 8], [], 3)
11. generateSubsequences([-7, -3, -2, 5, 8], [-2], 3)
12. generateSubsequences([-7, -3, -2, 5, 8], [-2], 4)
13. generateSubsequences([-7, -3, -2, 5, 8], [-2], 5)
14. generateSubsequences([-7, -3, -2, 5, 8], [-2, 8], 5)
15. generateSubsequences([-7, -3, -2, 5, 8], [-2, 5], 4)
. . .이하 생략
5. generateSubsequences([-7, -3, -2, 5, 8], [], 4)
8. generateSubsequences([-7, -3, -2, 5, 8], [5], 4)
9. generateSubsequences([-7, -3, -2, 5, 8], [5], 5)
10. generateSubsequences([-7, -3, -2, 5, 8], [5, 8], 5)
6. generateSubsequences([-7, -3, -2, 5, 8], [], 5)
7. generateSubsequences([-7, -3, -2, 5, 8], [8], 5)
소스코드
사용언어 : c++
#include <iostream>
#include <vector>
using namespace std;
int N, S, result;
// 백트래킹을 이용하여 부분 수열 생성
void generateSubsequences(vector<int>& sequence, vector<int>& current, int index) {
if (index == sequence.size()) {
// 현재 부분 수열 출력
int sum = 0;
for (int num : current) {
sum += num;
}
if (current.size() != 0 && sum == S) result++;
return;
}
// 현재 원소를 선택하지 않고 다음 원소로 이동
generateSubsequences(sequence, current, index + 1);
// 현재 원소를 선택하고 다음 원소로 이동
current.push_back(sequence[index]);
generateSubsequences(sequence, current, index + 1);
// 백트래킹을 위해 선택한 원소 제거
current.pop_back();
}
int main() {
vector<int> sequence;
vector<int> current;
cin >> N >> S;
int num;
for (int i=0; i<N; i++) {
cin >> num;
sequence.push_back(num);
}
generateSubsequences(sequence, current, 0);
cout << result << endl;
return 0;
}
오늘도 지피티에게 물어보기
한줄평
백트래킹 더 공부해야겠다. ㄷㄷ
'스터디 > 알고리즘' 카테고리의 다른 글
[Algorithm] 백준 - 효율적인 해킹 (1325번) (1) | 2023.08.31 |
---|---|
[Algorithm] 백준 - N과 M (10) (15664번) (0) | 2023.08.23 |
[Algorithm] 백준 - 두 스티커 (16937번) (0) | 2023.08.18 |
[Algorithm] 백준 - 크로스워드 퍼즐 쳐다보기 (3005번) (0) | 2023.07.04 |
[Algorithm] 백준 - 후위 표기식2 (1935번) (0) | 2023.06.27 |
Comments