ALGORITHM

[백준] 2798번 블랙잭 java

SZCODE 2022. 10. 25. 09:26

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

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

순열로 M보다 작은 합의 모든 경우의 수를 따졌다

어렵게 생각하지 않고 풀 수 있을 문제긴 하다.

순열에서 중복 제거를 하면 개선될 수 있을 거 같다.

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

public class Main {
	static int N,M,answer,sum=0,max = 0;
	static int[] arr,output;
	static boolean[] visited;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		arr = new int[N];
		output = new int[N];
		visited = new boolean[N];
		int r = 3;
		
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		perm(N,0,r);
		System.out.println(answer);
		
	}
	public static void perm(int n, int depth, int r) {
		if(depth == r) {
			for (int i = 0; i < r; i++) {
				sum+= output[i];
			}
			if(sum<=M) {
				if(max<=sum) {
					max = sum;
				}
			}
			answer =max;
			sum = 0;
			
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			if(!visited[i]) {
				visited[i] = true;
				output[depth] = arr[i];
				perm(n,depth+1,r);
				visited[i] = false;
			}
		}
	}
}

'ALGORITHM' 카테고리의 다른 글

[백준] 14719번 빗물  (0) 2020.10.24