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

김김님의 프로필 이미지
김김

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

2. 바둑이 승차

챕터8 - P01_합이같은부분집합_DFS_아마존인터뷰 관련 질문입니다.

작성

·

280

0

강의 듣기 전, 혼자 풀어볼 때 코드를 이렇게 짰는데 이것도 맞는 풀이일까요 ...?

import java.util.*;
import java.io.*;

/*
N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때
두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요.
둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어 합니다.
예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.
ex.
6
1 3 5 6 7 10
-> YES
 */
public class P01_합이같은부분집합_DFS_아마존인터뷰 {

    static int total;
    static int[] arr;
    static String answer;
    static int index;
    static int sum;
    static int N;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        total = 0;
        for (int i=0; i<N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            total += arr[i];
        }

        index = 0;
        sum = 0;
        answer = "NO";

        DFS(index);
        System.out.println(answer);
    }

    public static void DFS(int index) {
        if (sum*2 > total || index==N) {
            return;
        } else {
            sum += arr[index];
            if (sum*2 == total) {
                answer = "YES";
                return;
            }
            DFS(index+1);

            sum -= arr[index];
            DFS(index+1);
        }
    }
}

 

채점 사이트에서 통과하기는 하는데 이 풀이가 맞아서 통과한건지 아님 운좋게(?) 테스트 케이스 5개가 다 맞아서 통과한건지 뭔가 풀이에 대한 확신이 없어서요 .. !

답변 1

0

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

안녕하세요^^

에지케이스는 없어 보입니다. 잘 하셨습니다.

김김님의 프로필 이미지
김김

작성한 질문수

질문하기