Algorithm

[Algorithm/Java] 알고리즘 자바 합이 같은 부분집합 DFS (코딩테스트, DFS, BFS, 두 개의 부분집합의 합이 서로 같은 경우)

권락현 2022. 5. 15. 00:00


1. 문제 설명

  • 설명
    N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때
    두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요.
    둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어합니다.
    예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10}으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.
  • 입력
    첫 번째 줄에 자연수 N(1<=N<=10)이 주어집니다.
    두 번째 줄에 집합의 원소 N개가 주어진다. 각 원소는 중복되지 않는다.
  • 출력
    첫 번째 줄에 “YES" 또는 ”NO"를 출력한다.
 

 

 

2. 문제 코드 및 풀이 설명

import java.util.Scanner;

public class SubsetOfEqualSum {
  static String answer = "NO";
  static int n, total = 0;
  boolean flag = false;

  public static void main(String[] args) {
    SubsetOfEqualSum T = new SubsetOfEqualSum();
    Scanner kb = new Scanner(System.in);
    n = kb.nextInt();
    int[] arr = new int[n];
    for (int i = 0; i < n; i++) {
      arr[i] = kb.nextInt();
      total += arr[i]; // 모든 원소의 합을 미리 저장
    }
    T.DFS(0, 0, arr);
    System.out.println(answer);
  }

  // 해결방법
  // 한쪽 부분집합만 구한다고 가정
  // 첫번째 원소부터 차례대로 경우의 수를 체크
  // 해당 원소가 합해진 경우, 빠진 경우를 나누어서 체크
  // 이때 구해진 부분집합의 합 중 전체합의 절반인 값이 있다면 두 부분집합의 합이 같은 경우이므로 YES리턴
  // 만약 없다면 그대로 NO리턴
  public void DFS(int L, int sum, int[] arr) {
    if (flag) return; // yes가 발견되면 나머지를 다 리턴
    if (sum > total / 2) return; // 만약 합이 전체 합의 절반보다 커진다면 두 개의 부분집합의 합이 같을 수 없으므로 리턴
    if (L == n) {
      // 부분집합의 합이 전체 합의 절반일 경우 합이 같은 부분집합이 있으므로 YES리턴
      if ((total - sum) == sum) {
        answer = "YES";
        flag = true; // yes가 발견되었다고 알리는 변수
      }
    } else {
      DFS(L + 1, sum + arr[L], arr); // 현재 원소를 더한 경우
      DFS(L + 1, sum, arr); // 현재 원소를 더하지 않은 경우
    }
  }
}

 

3. 출력 예시

입력
6
1 3 5 6 7 10

출력
YES

 

 

 


위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!

https://inf.run/iAi6

 

자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com