inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

합이 같은 부분 집합 문제 질문 드립니다.

150

sbwoo96

작성한 질문수 1

0

안녕하세요, 강의 잘 듣고 있습니다.

작성한 코드 실행 시 테스트 케이스 4번에서만 오답처리 되어 확인을 해봤습니다.

4번째 테스트 케이스인 9, [3 6 13 11 7 16 34 23 12] 를 입력한 후 디버깅을 해본 결과

실제로 중복집합이 발생하는 것으로 확인됐습니다.

제 코드 상에 어떤 부분이 문제가 됐는지 알고 싶습니다.

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static int level;

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int size = sc.nextInt();

        int max = 0;

        int dep[] = new int[size + 1];

        level = size;

        for (int i = 1; i < dep.length; i++) {
            int val = sc.nextInt();
            dep[i] = val;
            if (val > max) {
                max = val;
            }

        }

        int[] check = new int[max + 1];

        Map<Integer, Integer> map = new HashMap<>();

        dfs(1, check, dep, map);

        Collection<Integer> values = map.values();

        boolean duplicate = false;

        for (int i : values) {
            if (i != 1) {
                System.out.println("YES");
                duplicate = true;
                break;
            }
        }

        if (!duplicate) {
            System.out.println("NO");
        }

    }

    public static void dfs(int l, int check[], int[] depth, Map<Integer, Integer> map) {
        if (l == level + 1) {
            int sum = 0;
            for (int i = 1; i < check.length; i++) {
                if (check[i] == 1) {
                    sum += i;
                }
            }
            if (sum > 0) {
                map.put(sum, map.getOrDefault(sum, 0) + 1);
                System.out.println("Sum: " + sum + ", Count: " + map.get(sum));


            }
        } else {
            check[depth[l]] = 1;
            dfs(l + 1, check, depth, map);
            check[depth[l]] = 0;
            dfs(l + 1, check, depth, map);
        }
    }
}

java 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

sbwoo96님, 합이 같은 부분집합 문제에 대한 질문에 감사드립니다. 해당 질문과 관련하여, 유사한 질문 및 해결 방안을 제시한 기존 게시글을 찾아드릴 수 있습니다.

지식공유자 김태원님이 제공한 다음 답변이 sbwoo96님의 문제 해결에 도움이 될 수 있습니다:

import java.util.Scanner;

class Main {
    static int n,total;
    static int[] array;
    static boolean flag;

    public static void main(String[] args) {
        Main T = new Main();

        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        total =0;
        array = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = sc.nextInt();
            total += array[i];
        }
        if(total % 2 == 1) {
          System.out.println("NO");
          return;
        }
        flag = false;
        T.DFS(0, 0);
        if (flag) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }

    void DFS(int L, int sum) {
        if (flag || sum > total / 2 || L == n) {
            return;
        }
        if (sum == total / 2) {
            flag = true;
            return;
        }
        DFS(L + 1, sum + array[L]);
        DFS(L + 1, sum);
    }
}

이 수정된 코드는 입력 받은 집합의 전체 합이 홀수인 경우 미리 NO를 출력하고 프로그램을 종료시키는 로직을 추가하고 있습니다. 이는 합이 같은 부분집합을 만들 수 없음을 의미합니다.

질문에서 언급된 중복 집합 문제는 코드 내부 특정 조건의 로직 처리 방식이 원인일 수 있으며, 합이 같으려면 전체 집합의 합이 짝수여야 하고, 중복되지 않는 요소들로 구성된 부분집합을 만드는 조건들을 정확히 검토해야 합니다. sbwoo96님의 코드에서는 특정 부분집합의 합이 중복으로 나타날 수 있도록 map을 사용하여 집계하고 있는데, 이 점에서 로직을 재검토해보실 필요가 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

32

1

갑자기 채점 사이트가 바뀌었어요

0

34

1

문제 리스트 페이지

0

29

1

채점 사이트 관련 질문드립니다

0

24

1

봉우리 문제 질문입니다

0

83

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

65

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

45

1

강의 수강후 코딩테스트

0

111

1

answer 변수 사용 여부

0

46

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

44

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

63

1

StringBuilder vs BufferdWriter

0

48

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

57

1