백준 18429 - 근손실

Updated:

Java

18429 번 - 근손실

문제

접근 방법

근손실을 방지해야한다.
DFS의 순열을 사용하여 N일 동안 사용할 키트의 순서를 정한다.
순서가 정해질 때 마다, 운동을 진행하여 근손실을 발생하는지 확인하여 미발생시 결과값을 증가시킨다.

코드

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

public class Main {
	static int n, result, k;
	static int[] sel, arr;
	static boolean[] vis;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	k = stoi(stk.nextToken());

    	sel = new int[n];
    	arr = new int[n];
    	vis = new boolean[n];

    	stk = new StringTokenizer(br.readLine());
    	for(int i = 0; i < n; i++) {
    		arr[i] = stoi(stk.nextToken());
    	}

    	DFS(0);

    	System.out.println(result);
    	br.close();
	}
	// 사용할 운동 키드들의 순서를 정한다.
	private static void DFS(int lv) {
		if(lv == n) {
			// 근 손실이 발생하지 않으면, 해당 순서를 결과값에 더 한다.
			if(doExercise()) {
				result++;
			}
			return;
		}

		for(int i = 0; i < n; i++) {
			if(!vis[i]) {
				sel[lv] = arr[i];
				vis[i] = true;
				DFS(lv + 1);
				vis[i] = false;
			}
		}
	}
	// 운동 시작
	private static boolean doExercise() {
		int weight = 500;

		for(int i = 0; i < n; i++) {
			weight += sel[i];
			weight -= k;
			// 운동 중, 근손실이 발생하였을 때
			if(weight < 500)
				return false;
		}

		return true;
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}