인프런 커뮤니티 질문&답변

네오플들어가자꼭님의 프로필 이미지
네오플들어가자꼭

작성한 질문수

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

60. 합이 같은 부분 집합 (아마존 인터뷰 문제 : DFS 완전탐색)

4번 문제만 계속 틀립니다.

해결된 질문

작성

·

386

0

안녕하세요 선생님!

항상 좋은 강의 감사히 잘 듣고 있습니다.

이번 문제에서 제 코드로는 4번 문제가 계속 틀렸다고 나와서 선생님 코드 그대로 따라했는데도 4번 문제가 틀렸다고 되더라구요... 채점기 output이 잘못된건지 제가 짠 코드가 잘못된건지 확인 부탁드립니다...!

 

  1. 제 코드

    #include <stdio.h>
    #include <cmath>
    
    int n;
    int a[11];
    int b[100];
    int c[1025];
    int sum;
    int idx = 1;
    
    void DFS(int x)
    {
    	if(x == n+1)
    	{
    		sum = 0;
    		for(int i = 1; i <= n; i++)
    			if(b[a[i]] == 1)
    				sum += a[i];
    		c[idx++] = sum;
    	}
    	else
    	{
    		b[a[x]] = 1;
    		DFS(x+1);
    		b[a[x]] = 0;
    		DFS(x+1);
    	}
    }
    
    int main()
    {
    	scanf("%d", &n);
    	
    	for(int i = 1; i <= n; i++)
    		scanf("%d", &a[i]);
    	
    	DFS(1);
    	
    	for(int i = 1; i <= pow(2, n); i++)
    	{
    		int temp = c[i];
    		if(temp == 0)
    			continue;
    		for(int j = 1; j <= pow(2, n); j++)
    		{
    			if(i == j)
    				continue;
    			
    			if(temp == c[j])
    			{
    				printf("YES");
    				return 0;
    			}
    		}
    	}
    	
    	printf("NO");
    	return 0;
    }
  2. 선생님 코드

#include <stdio.h>

int n;
int a[11];
int total = 0;

bool flag = false;
void DFS(int x, int sum)
{
	if(sum > (total/2)) return;
	if(flag) return;
	if(x == n+1)
	{
		if(sum == (total/2))
		{
			flag = true;
		}
	}
	else
	{
		DFS(x+1, sum+a[x]);
		DFS(x+1, sum);
	}
}

int main()
{
	scanf("%d", &n);
	
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		total += a[i];
	}
	
	DFS(1, 0);
	
	if(flag)
		printf("YES");
	else
		printf("NO");
	return 0;
}

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

  1. 님의 코드는 아래와 같은 입력을 YES로 출력합니다.

4

1 3 4 5

위 입력을 {1, 3, 4}라는 부분집합과 {3, 5}라는 부분집합이 합이 같다고 판단해서 YES를 출력합니다.

답은 NO가 나와야 합니다. {1, 3, 4}가 하나의 부분집합이면 반대편 부분집합은 1, 3, 4를 뺀 {5}인 부분집 합 이어야 합니다. 즉 전체집합을 두 개의 부분집합으로 나누는 것입니다. 동일원소가 양속 부분집합에 모두 사용되면 안됩니다.

  1. 제 코드는 아래 부분을 수정하면 됩니다. total / 2를 하다보면 소수점 이하가 절삭되는 경우가 있어 if 조건문이 참이 되는 경우도 있습니다. if(sum == (total - sum))으로 바꾸면 100점 나올겁니다. 예를 들면 total값이 15이고 sum 값이 7이면 if( 7 == 15/2) 가 참이 되어 버립니다.

    if(x == n+1)
    {
    	if(sum == (total/2)) //if(sum == (total - sum)) 으로 수정
    	{
    		flag = true;
    	}
    }

아하 바로 이해되었습니다 감사합니다!

네오플들어가자꼭님의 프로필 이미지
네오플들어가자꼭

작성한 질문수

질문하기