λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[SW Expert Academy] - (D3)2817. λΆ€λΆ„ μˆ˜μ—΄μ˜ ν•©

by 주발2 2020. 7. 19.
λ°˜μ‘ν˜•

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7IzvG6EksDFAXB&categoryId=AV7IzvG6EksDFAXB&categoryType=CODE

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

μ½”λ“œ

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

public class Solution {
	/*
	 * N:     μžμ—°μˆ˜ 갯수
	 * K:     μžμ—°μˆ˜λ₯Ό μ„ νƒν•΄μ„œ 합이 Kκ°€ λ˜λŠ” 경우
	 * arr[]: N개의 μžμ—°μˆ˜λ₯Ό 담을 λ°°μ—΄
	 * ans:   경우의 수
	 */
	private static int N;
	private static int K;
	private static int arr[];
	private static int ans;
	
	private static void dfs(int count, int sum) {
		/* 기저사둀: μžμ—°μˆ˜ x개 μ„ νƒν•΄μ„œ 합이 Kκ°€ λ˜λŠ” 경우 */
		if(sum == K) {
			ans ++;
			return;
		}
		
		/* 기저사둀: μžμ—°μˆ˜ x개의 합이 K보닀 큰경우 || μ„ νƒν•œ μžμ—°μˆ˜μ˜ κ°―μˆ˜κ°€ Nκ°œμ™€ λ™μΌν•œ 경우*/
		if(sum > K || count == N) {
			return;
		}
		
		// 자기 μžμ‹  포함
		dfs(count+1, sum+arr[count]);
		
		// 자기 μžμ‹  미포함
		dfs(count+1, sum);
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		
		int t = Integer.parseInt(bf.readLine());
		
		for(int tc=1; tc<=t; tc++) {
			st = new StringTokenizer(bf.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			arr = new int[N];
			ans = 0;
			
			st = new StringTokenizer(bf.readLine());
			for(int i=0; i<N; i++) {
				arr[i] = Integer.parseInt(st.nextToken());
			}
			
			dfs(0, 0);
			System.out.println("#" + tc + " " + ans);
		}
		
		bf.close();
	}

}

풀이

nCr μ‘°ν•© 문제.

μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 ν•΄κ²°ν•˜κ³ , μž¬κ·€ν•¨μˆ˜μ˜ μ’…λ£Œ 쑰건은 λ‹€μŒκ³Ό κ°™λ‹€.

 - κ³ λ₯Έ μžμ—°μˆ˜μ˜ 합이 K와 λ™μΌν•œ 경우

 - κ³ λ₯Έ μžμ—°μˆ˜μ˜ 합이 K보닀 ν¬κ±°λ‚˜, κ³ λ₯Έ μžμ—°μˆ˜μ˜ κ°―μˆ˜κ°€ N개일 경우

 

dfs μž¬κ·€ ν˜ΈμΆœμ„ 톡해 ν˜„μž¬ μ„ νƒλœ 숫자λ₯Ό ν¬ν•¨ν•˜λŠ” 경우

 - dfs(count+1, sum+arr[count])

 

ν˜„μž¬ μ„ νƒλœ 숫자λ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šκ³  λ‹€μŒμœΌλ‘œ κ°€λŠ” 경우

 - dfs(count+1, sum)

 

둜 λ‚˜λˆ„μ–΄ 탐색을 진행함.

 

λ°˜μ‘ν˜•

λŒ“κΈ€