전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 1182 부분수열의 합 [Java]

2021. 11. 26. 13:19

BOJ 1182 부분수열의 합

1. 문제 링크

https://www.acmicpc.net/problem/1182

2. 문제 해설

재귀를 이용해서 풀었다. 각 원소마다 더할 것인지 더하지 않을 것인지를 선택할 수 있고 그에 따라 재귀 함수가 계속 호출된다.
그러므로 시간복잡도는 O(2^n)이다. 최악의 경우에 n이 20이기에 주어진 시간 안에 충분히 해결할 수 있다.
재귀 함수의 매개 변수로 idx와 sum을 주어 현재 몇번째 idx에 위치해있고, 더한 값이 얼마인지를 담았다.
재귀 함수의 탈출 조건은 idx가 n과 같아지면 탈출하고, 만약 sum이 s와 일치하면 경우의 수 값 cnt를 +1 해준다.
문제 조건에서 부분수열의 크기가 양수여야하는 조건이 있으므로 만약 s가 0이라면 아무 것도 더해주지 않은 경우를 빼줘야한다.
그러므로 s가 0이면 cnt에서 -1을 해주고 아니면 cnt를 출력하면 된다.

3. 코드 보기

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

public class Main {
    static int n, s;
    static int cnt, ans;
    static int[] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        s = Integer.parseInt(st.nextToken());
        arr = new int[n];

        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        DFS(0, 0);

        if (s == 0) {
            ans = cnt - 1;
        } else {
            ans = cnt;
        }

        bw.write(Integer.toString(ans));
        br.close();
        bw.flush();
        bw.close();
    }

    static void DFS(int sum, int idx) {
        if (idx == n) {
            if (sum == s) {
                cnt++;
            }

            return;
        }

        DFS(sum, idx + 1);
        DFS(sum + arr[idx], idx + 1);
    }
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 18808 스티커 붙이기 [Java]  (0) 2021.11.28
BOJ 2623 음악프로그램 [Java]  (0) 2021.11.27
BOJ 11659 구간 합 구하기 4 [Java]  (0) 2021.11.25
BOJ 11653 소인수분해 [Java]  (0) 2021.09.15
BOJ 6588 골드바흐의 추측 [Java]  (0) 2021.09.15
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 18808 스티커 붙이기 [Java]
    • BOJ 2623 음악프로그램 [Java]
    • BOJ 11659 구간 합 구하기 4 [Java]
    • BOJ 11653 소인수분해 [Java]
    모달조아
    모달조아

    티스토리툴바