[C++] 1182번: 부분수열의 합

2023. 8. 12. 18:34·[게임 개발] 알고리즘 공부/백준

링크

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

문제

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입출력 예제

입력

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

출력

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.

예제 입력 1 복사
5 0
-7 -3 -2 5 8
예제 출력 1 복사
1

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#include <queue>
#include <stack>

using namespace std;

vector<int> nums;
int answer = 0;
int n, s;

void dfs(int index, int sum)
{
	// 배열의 끝까지 탐색하면 종료
	if (index == n) return;
	// 현재 인덱스의 수와 총합의 합이 목표합과 같으면 카운트 증가
	if (nums[index] + sum == s) answer++;

	dfs(index + 1, sum);
	dfs(index + 1, sum + nums[index]);
}

int main(void)
{
	cin.tie(NULL);
	cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> n >> s;

	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		nums.push_back(temp);
	}

	dfs(0, 0);

	cout << answer << endl;
	return 0;
}

풀이

  • dfs를 통해 해결하였다.

  • 연속적으로 이어진 수만 따지는 것이 아니라, 1,3,5,7이 있다면 1,7도 가능한
    부분수열을 구하는 것이다.

  • 현재 인덱스의 수를 총합계에 저장하고 다음 인덱스로 넘어가는 경우,
    저장하지 않고 다음 인덱스로 넘어가는 경우
    총 2가지의 경우를 모두 호출하여 모든 부분수열의 가능성을 탐색하도록 한다.
저작자표시 (새창열림)

'[게임 개발] 알고리즘 공부 > 백준' 카테고리의 다른 글

[C++] 1541번: 잃어버린 괄호  (1) 2023.10.15
[C++] 5568번: 카드 놓기  (0) 2023.08.13
[C++] 1120번: 문자열  (0) 2023.08.10
[C++] 1051번: 숫자 정사각형  (0) 2023.08.08
[C++] 13975번: 파일 합치기 3  (0) 2023.08.07
'[게임 개발] 알고리즘 공부/백준' 카테고리의 다른 글
  • [C++] 1541번: 잃어버린 괄호
  • [C++] 5568번: 카드 놓기
  • [C++] 1120번: 문자열
  • [C++] 1051번: 숫자 정사각형
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      브루트포스
      context switching
      역참조
      데드락
      프로세스
      투포인터
      스레드
      dfs
      메모리구조
      슬라이딩 윈도우
      dp
      해시
      우선순위 큐
      문자열
      그리디
      누적합
      참조자
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 1182번: 부분수열의 합
    상단으로

    티스토리툴바