profile image

L o a d i n g . . .

반응형

코드

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

int n, ch[11], arr[11];
vector<int> v;
bool isEnd = false;

void DFS(int L)
{
	if (isEnd) return;

	int i, sum = 0;

	if (L == n + 1)
	{
		for (i = 1; i <= n; ++i)
		{
			if (ch[i] == 1) sum += arr[i];
		}
		for (i = 0; i < v.size(); ++i)
		{
			if (v[i] == sum)
			{
				cout << "YES" << endl;
				isEnd = true;
				return;
			}
		}
		v.push_back(sum);
	}
	else
	{
		ch[L] = 1;
		DFS(L + 1);
		ch[L] = 0;
		DFS(L + 1);
	}
}

int main(void)
{
	int i;
	cin >> n;

	for (i = 1; i <= n; ++i)
	{
		cin >> arr[i];
	}

	DFS(1);
	if(!isEnd) cout << "NO" << endl;
}

 

출력 결과

 

채점 결과

 

문제 이해를 잘못했다...

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

int n, ch[11], arr[11];
bool isEnd;

// 방문하려는 부분집합과 방문하지 않는 부분집합의 합이 같은 경우에만 YES

void DFS(int L)
{
	if (isEnd) return;

	int sum1 = 0, sum2 = 0;

	if (L == n + 1)
	{
		for (int i = 1; i <= n; ++i)
		{
			if (ch[i] == 0) sum1 += arr[i];
			else sum2 += arr[i];
		}
		if (sum1 == sum2) isEnd = true;

	}
	else
	{
		ch[L] = 1;
		DFS(L + 1);

		ch[L] = 0;
		DFS(L + 1);
	}
}

int main(void)
{
	int i;
	cin >> n;

	for (i = 1; i <= n; ++i)
	{
		cin >> arr[i];
	}

	DFS(1);

	cout << (isEnd ? "YES" : "NO") << endl;
}

 

 

해당 포스트는 'it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비' 강의를 수강하며 개인 백업용으로 메모하였습니다.

인프런: https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98#

 

it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 - 인프런

알고리즘과 자료구조를 이용해 문제해결력을 기르는게 주 목적입니다. 초급 취업 ・ 이직 프로그래밍 언어 알고리즘 C++ 알고리즘 코딩 테스트 개발자취업 온라인 강의 알고리즘

www.inflearn.com

반응형
복사했습니다!