728x90

 

문제 풀이

해당 문제는 subset(부분집합) 을 만들어서 전체 배열의 원소의 합을 2로 나누었을 때 부분집합 의 합과 똑같으면 YES 다르면 NO 를 출력 하는 방식으로 접근 해보았다.

 

먼저 부분집합을 만드는 방식에 있어서 해당 원소를 부분집합으로 포함 할지 안할지 이렇게 2진 트리로 재귀호출을 할수 있다.

 

func SameSumSubSet(depth, sum int) {
    SameSumSubSet(depth+1, sum+array[depth])
    SameSumSubSet(depth+1, sum)
}

 

depth 와 함께 sum 이라는 변수를 재귀호출 로 넘김으로써 depth 가 N 과 같아졌을때 총합 / 2 와 비교하기 위해서 사용한다.

 

첫번째 재귀 호출은 해당원소를 부분집합으로 사용하는 재귀호출이고 두번째 재귀호출은 사용하지 않는 재귀호출이다.

if depth == N {
    if total-sum == sum {
        answer = "YES"
        flag = true
        return
    }
}

 

depth 가 N 과 같아졌을때는 total 과 비교하여 부분집합이 나머지 부분집합과 합이 일치하는지 판단하고 flag 를 true 로 바꿈으로써 더이상 재귀호출 하지않고 계속 탈출하기 위함이다.

 

package dfs

import (
	"fmt"
	"testing"
)

var N int
var array []int
var check []bool
var answer string
var flag bool
var total int

func SameSumSubSet(depth, sum int) {
	if flag {
		return
	}

	if depth == N {
		if total-sum == sum {
			answer = "YES"
			flag = true
			return
		}
	} else {
		SameSumSubSet(depth+1, sum+array[depth])
		SameSumSubSet(depth+1, sum)
	}

}

func TestSameSumSubSet(t *testing.T) {
	N = 6
	array = []int{1, 3, 5, 6, 7, 10}
	check = make([]bool, N)
	flag = false
	for _, ele := range array {
		total += ele
	}
	SameSumSubSet(0, 0)
	fmt.Println(answer)
}

 

 

전체 코드입니다.

 

이해가 안가시는 부분이 있다면 댓글로 물어봐주세요!

728x90

'Algorithm > inflearn' 카테고리의 다른 글

문제 - 뮤직비디오 (결정알고리즘)  (0) 2021.06.22