본문 바로가기
알고리즘 문제 풀이/완전탐색

백준 - 부분수열의 합(Java)

by 가나무마 2022. 1. 25.
728x90

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.

https://github.com/ROUTINE-STUDY/Algorithm

저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

 

GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

문의는 댓글 바람.

문제 출처 :https://www.acmicpc.net/problem/14225

 

[문제 설명]

수열의 조합으로 나올 수 없는 가장 작은 수를 구하시오.

 

[접근 방법]

문제 그대로 수열을 조합할 수 있는 모든 경우를 구하고, 그 중에서 만들 수 없는 가장 작은 수를 리턴하면 된다.

나 같은 경우에는 조합의 모든 경우를 구하고, boolean 배열에 존재하는 숫자면 true로 처리해줬다.

수열의 크기는 최대 20, 수의 값의 최대는 100,000이므로, 수열의 합의 최대값은 20*100,000 = 2,000,000

따라서 200만짜리 boolean 배열을 만들어줘야 한다. 언뜻 보기엔 커보인다.

그러나 boolean은 1개의 2byte라  총합해서 4mb정도 될 듯하다.

 

시간복잡도는 모든 숫자가 있나 없나이므로 O(2^(수열의 크기)) => O(2^N) => 2^20

공간복잡도는 O(S) => 10,0000

 

[Java]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static boolean[] isExistNumber = new boolean[2000001];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int sizeOfNumbers = Integer.parseInt(br.readLine());
        int[] arrOfNumbers = new int[sizeOfNumbers];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < sizeOfNumbers; i++) {
            arrOfNumbers[i] = Integer.parseInt(st.nextToken());
        }

        int answer = 0;
        checkPossibleNum(arrOfNumbers, 0, 0);
        for (int i = 1; i < isExistNumber.length; i++) {
            if (!isExistNumber[i]) {
                answer = i;
                break;
            }
        }
        System.out.println(answer);
    }

    // 만들 수 있는 숫자는 방문처리
    private static void checkPossibleNum(int[] arrOfNumbers, int index, int sum) {
        if (index == arrOfNumbers.length) {
            return;
        }

        // 현재 숫자를 더했을 경우,
        isExistNumber[sum+arrOfNumbers[index]] = true;
        checkPossibleNum(arrOfNumbers, index+1, sum+arrOfNumbers[index]);
        // 현재 숫자를 더하지 않았을 경우
        isExistNumber[sum] = true;
        checkPossibleNum(arrOfNumbers, index+1, sum);
    }
}

 

https://github.com/ROUTINE-STUDY/Algorithm/pull/241

728x90
반응형

'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글

백준 - 보물섬  (0) 2022.01.26
백준 - 연산자 끼워넣기(Java)  (0) 2022.01.25
백준 - 대표 자연수  (0) 2022.01.25
백준 - 연구소  (0) 2022.01.23
백준 - 일곱 난쟁이(Java) 다시 풀기  (0) 2022.01.22