백준 16922번
https://www.acmicpc.net/problem/16922
private static void DFS(int depth, int depthLimit, int indexStart, int sum) {
if (depth == depthLimit) {
if(!isVisited[sum]) {
isVisited[sum] = true;
result++;
}
return;
}
for (int i = indexStart; i < 4; i++) {
DFS(depth + 1, depthLimit, i, sum + lomeArr[i]);
}
} // End of DFS
재귀의 깊이를 알 수 있는 depth
그리고 중복을 포함 할 수 있도록 반복문에서 사용할 indexStart
를 넣어주고, 마지막으로 로마 숫자 조합에서 총합을 계산할 매개변수 sum
이 있다.
4개의 로마숫자에서 하나를 선택하여 계속해서 총합을 계산하고, 처음 나온 값은 isVisited
에서 true를 줌으로써 만들어진 숫자를 한번씩만 경우의 수에서 증가하도록 만들었다.
import java.io.*;
public class Main {
static int[] lomeArr = {1, 5, 10, 50};
static boolean[] isVisited;
static int result = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 사용 할 수 있는 문자 개수
isVisited = new boolean[4845];
DFS(0, N, 0, 0);
System.out.print(result);
} // End of main
private static void DFS(int depth, int depthLimit, int indexStart, int sum) {
if (depth == depthLimit) {
if(!isVisited[sum]) {
isVisited[sum] = true;
result++;
}
return;
}
for (int i = indexStart; i < 4; i++) {
DFS(depth + 1, depthLimit, i, sum + lomeArr[i]);
}
} // End of DFS
} // End of Main class