코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67
문제
https://www.acmicpc.net/problem/1182
[나의 풀이]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
    // static 변수 초기화
    // ans (S에 해당하는 갯수)
    static int ans = 0;
    static void print(int[] arr, boolean[] visited, int S) {
        int check_S = 0;
        for(int i = 0; i < arr.length; i++) {
            // 조합을 구한뒤 check_S에 더해서 S인지 확인
            if(visited[i] == true){
                check_S += arr[i];
            }
        }
        // 합이 S이면 ans에 +1
        if (check_S == S){
            ans += 1;
        }
        
        return ;
    }
    // combination 함수 정의
    static void comb1(int[] arr, boolean[] visited, int start, int r, int S) {
        if(r == 0) {
            print(arr, visited,S);
            return;
        } else {
            for(int i = start; i < arr.length; i++) {
                visited[i] = true;
                comb1(arr, visited, i + 1, r - 1,S);
                visited[i] = false;
            }
        }
    }
    public static void main(String[] args) throws IOException {
        
        // 입력값 받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int  N = Integer.parseInt(st.nextToken());
        int [] arr = new int [N];
        int  S = Integer.parseInt(st.nextToken());
        st  = new StringTokenizer(br.readLine());
        for(int i = 0; i<N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        // 부분수열 최소 1개부터 최대 5개까지 (1 <= r <= 5)
        boolean [] visited = new boolean [arr.length];
        int start = 0;
        for (int r = 1; r<arr.length+1; r++){
            comb1(arr, visited, start, r, S);
        }
        
        // 최종답 출력
        System.out.print(ans);
    }
}
[팀원의 풀이1]
브르투포스 알고리즘 (combination 활용)
# coding = utf-8
import sys
input = sys.stdin.readline
from itertools import combinations
n, s = map(int, input().split())
ls = list(map(int, input().split()))
res = 0
for i in range(1, n+1) :
    for choice in combinations(ls, i) :
        print(choice)
        if sum(choice) == s:
            res += 1
print(res)
[팀원의 풀이2]
백트레킹 알고리즘 (재귀함수)
# coding = utf-8
import sys
input = sys.stdin.readline
n, s = map(int, input().split())
ls = list(map(int, input().split()))
ans = 0
def backtracking(idx, res):
    global ans
    if idx >= n:
        return
    res += ls[idx]
    if res == s:
        ans += 1
    backtracking(idx+1, res)
    backtracking(idx+1, res-ls[idx])
backtracking(0, 0)
print(ans)
브루트포스 or 백트레킹으로 해결 가능한 문제입니다. python으로 활용한다면 간단히 combination 함수로 부분집합을 구할 수 있지만 java 기준으로는 직접 조합을 구현해야했습니다. 그리하여 구글링!!!을 통해서
출처 :
https://minhamina.tistory.com/38
조합 알고리즘을 파악했고 문제에 적용시켰습니다! 문제 정의하는 것 자체는 어렵지 않았습니다. 하지만 백트레킹, 재귀함수 각 두가지 방법으로 combination 구현하는 코드들를 이해하는데 조금 시간을 소비했습니다.😰😰😰 그래도 최근에는 다른 사람의 코드를 자주 찾아보고 이해하는 힘을 기르다보니 스스로 실력이 느는게 느껴집니다! 화이팅!🐥🐥🐥
화이팅화이팅!!!