[BOJ알고리즘, C++]#1182_부분 수열의 합, 백트래킹, 조합 백트래킹

2024. 5. 15. 12:33· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. 백트래킹
  4. 2. '조합' 유형의 백트래킹, 다만, '반환'이 없는 백트래킹 설계
  5. #3. 코드

 

#1. 문제

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

 


 

#2. 풀이

 

1. 백트래킹

 

[알고리즘]#6_백 트래킹

[알고리즘]#6_백 트래킹 백 트래킹 알고리즘에 대해 알아보겠습니다. Overview 개념 예제 #0. 개념 1. 백 트래킹 백 트래킹 알고리즘은 문제 해결을 위해 여러 후보 해결책들을 점진적으로 탐색하며,

webddevys.tistory.com

백트래킹 알고리즘은 문제 해결을 위해 여러 후보를 점진적으로 탐색해 나가는 방법입니다. 백트래킹 알고리즘은 현재 후보 경로가 해결책으로 이어질 수 없다고 판단되면, 이전 레벨로 돌아가 다른 후보 해결책들을 탐색합니다. 백트래킹 알고리즘은 일반적으로 재귀 호출을 활용한 DFS를 통해 구현합니다.

 

2. '조합' 유형의 백트래킹, 다만, '반환'이 없는 백트래킹 설계

  1. '조합' 유형의 백트래킹 유형의 문제입니다. 다만, '음수'가 포함되어 있기 때문에, 설령 현재 총합이 5가 되었더라도 현재 경로에 대한 탐색을 계속 진행해야 합니다.
  2. 백트래킹에서 '순환 여부' 혹은 '간선의 방향성 유무'에 따라서, 각 정점에 대하여 방문여부를 체크할지 결정합니다. 해당 문제는 부분 수열의 원소들은 중복이 없어야 하기 때문에, '방문 여부'를 체크해 줍니다.

 


 

#3. 코드

 

/*
    @문제 : 수열의 부분 수열의 합으로 S값을 만들 수 있는 경우의 수 구하기
    @설명
            1. 백트래킹 - 조합 문제를 생각해보면 된다.
            2. 단, '양수' 뿐만 아니라, '음수'도 존재하기 때문에 현재 총 합이 S와 같을 때 dfs 탐색을 종료하면,
            이후에 또 다른 값들로 다시 S값을 만들 수 있는 경우가 존재할 수 있기 때문에 조심해야한다!

*/

#include <iostream>
#include <vector>
using namespace std;

#define MAX 21

int N, S, ans;
int arr[MAX];
bool visited[MAX];

void dfs(int idx, int sum)
{
    if(sum == S)
    {
        ans++;
        // 여기서 바로 return, 즉 깊이 우선 탐색을 종료하지 않는 것이 포인트다!
    }
    for(int i = idx; i<N; ++i)
    {
        if(!visited[i])
        {
            visited[i] = true;
            dfs(i, sum+arr[i]);
            visited[i] = false;
        }
    }
}

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

    cin >> N >> S;

    for(int i=0; i<N; ++i)
    {
        cin >> arr[i];
    }

    dfs(0,0);

    if(S==0) ans--;

    cout << ans;

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#10159_저울, 최단 경로, 길 찾기, 플로이드-워셜  (0) 2024.05.15
[BOJ알고리즘, C++]#15654_N과M(5), 백트래킹, 순열 백트래킹  (0) 2024.05.15
[BOJ알고리즘, C++]#3176_도로 네트워크, 트리, LCA, LCA 최단/최장 거리 찾기  (0) 2024.05.06
[BOJ알고리즘, C++]#1761_정점들의 거리, LCA, LCA 최단/최장 거리 찾기  (0) 2024.05.06
[BOJ알고리즘, C++]#1240_노드 사이의 거리, 최단 경로 알고리즘, BFS  (0) 2024.05.06
  1. #1. 문제
  2. #2. 풀이
  3. 1. 백트래킹
  4. 2. '조합' 유형의 백트래킹, 다만, '반환'이 없는 백트래킹 설계
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#10159_저울, 최단 경로, 길 찾기, 플로이드-워셜
  • [BOJ알고리즘, C++]#15654_N과M(5), 백트래킹, 순열 백트래킹
  • [BOJ알고리즘, C++]#3176_도로 네트워크, 트리, LCA, LCA 최단/최장 거리 찾기
  • [BOJ알고리즘, C++]#1761_정점들의 거리, LCA, LCA 최단/최장 거리 찾기
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 최단 경로
  • DP
  • 정렬
  • 개발
  • Effective C++
  • 기술 질문
  • 알고리즘
  • BFS
  • stl
  • 트리
  • unreal
  • Unreal Blueprint
  • C++
  • programmers
  • set
  • 디자인 패턴
  • 우선순위 큐
  • dfs
  • BOJ
  • 그래프

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#1182_부분 수열의 합, 백트래킹, 조합 백트래킹
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.