inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

454

결국네오플붙음

작성한 질문수 2

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;
}

c++ 코딩-테스트

답변 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;
    	}
    }

0

결국네오플붙음

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

87번 채점 프로그램에 오류가 있는 것 같습니다.

0

89

2

그리디 파트

0

115

2

안녕하세요. 선생님(54번 코드 관련 문의)

0

141

2

테스트 파일 exit_coe_1, time_limit_exceeded 질문

0

143

1

C언어로 코드를 짜면 채점 시에 한 문제 빼고 시간 초과가 발생하는데 해결하는 방법이 있을까요?

0

172

1

19번 질문있습니다

0

123

1

6번 관련 채점오류입니다

0

88

2

22번 문제는 C로 풀어주신 건가요 C++로 풀어주신 건가요?

0

166

2

dev C++ 콘솔창 바로 닫힘

0

245

1

최신화하기

0

171

1

채점이 안되요...

1

261

1

안녕하세요 강사님 정렬에 대해서 설명이 조금 더 듣고 싶습니다.

0

113

1

45번 공주구하기 문제를 list를 이용해서 이렇게 풀어도 될까요?

0

155

1

39번 두 배열 합치기 문제 채점 오류인가 코드 오류인가

0

155

0

채점기에서 틀렸다고 나오는데 이유를 모르겠습니다.

0

149

2

해당 강의에서 C언어로만 진행하는 강의 문의 건

0

145

2

87번 문제 섬나라 아일랜드 질문

0

128

1

16번 문제에서 직접 답을 대입하면 정답이 나오는데 채점에서 wrong answer가 나옵니다.

0

149

1

40번 교집합 문제

0

166

1

43번 뮤직비디오 문제 테스트케이스 4번을 만족 못합니다.

0

170

1

41. 연속된 자연수의 합 문제 질문있습니다.

0

166

1

질문있습니다.

0

193

2

시간초과가 나요

0

172

1

43번 문제 3 ~ 5번에 문제가 있는것 같습니다.

0

249

1