티스토리 뷰

알고리즘

61. 특정 수 만들기[DFS]

홍복치 2021. 1. 13. 17:36

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

4 12

2 4 6 8

 

출력예제 1

4

 

풀이 

- 2, 4, 6, 8로 +, -, 사용X 의 경우로 나누어서 12를 만든다.

- 세 경우에 따라 DFS(L+1, sum+a[L]) / DFS(L+1, sum-a[L]), DFS(L+1, sum)이 된다.

- count값을 0으로 두고 count값이 변하지 않으면 해당 수를 만들 수 없기 때문에 -1을 출력한다.

- 경우의 수를 추적해보고 싶으면 path배열을 두고 DFS함수 시작 전에 경우에 따라 path[L]에 a[L], -a[L], 0을 넣어 준다.

- sum이 원하는 값과 맞아떨어질 때 for문을 통해서 1~L-1(이때 L은 내가 원하는 곳 다음곳까지 가있기 때문)까지 path의 값을 출력한다.

#include <stdio.h>
#include <algorithm>
using namespace std;
int n, m, a[11], answer=0, path[11];

//61. 특정 수 만들기
void DFS(int L, int sum){
    if(L==n+1){
        //완성된 경우
        if(sum==m){
            answer++;
            for(int i=1;i<L;i++){
                printf("%d ", path[i]);
            }
            puts(""); //줄바꿈
        }
    }else{
        path[L]=a[L];
        DFS(L+1, sum+a[L]);
        path[L]=-a[L];
        DFS(L+1, sum-a[L]);
        path[L]=0;
        DFS(L+1, sum);
    }
}

int main(){
    int i;
    scanf("%d %d", &n, &m);
    for(i=1;i<=n;i++){
        scanf("%d", &a[i]);
    }
    DFS(1, 0);
    if(answer==0) printf("-1\n");
    else printf("%d\n", answer);
    return 0;
}

'알고리즘' 카테고리의 다른 글

39. 두배열 합치기  (0) 2021.01.15
프로그래머스-타겟 넘버[DFS]  (0) 2021.01.14
60. 합이 같은 부분집합[DFS]  (0) 2021.01.11
59. 부분집합 [DFS]  (0) 2021.01.08
57. 재귀함수 이진수 출력 [stack 이용]  (0) 2021.01.07
최근에 올라온 글
Total
Today
Yesterday