해당 코드는 dp 문제이다.
점화식을 찾는 것이 중요하다.
N=1
, 1 => 1가지
N=2
, 00, 11 => 2가지
N=3
, 001, 100, 111 => 3가지
N=4
, 0000, 0011, 1001, 1100, 1111 => 5가지
N=5
, 00001, 00100, 10000, 00111, 10011, 11001, 11100, 11111 => 8가지
N=6
, 000000, 000011, 001001, 100001, 001100, 100100, 110000, 001111, 100111, 110011, 111001, 111100, 111111 => 13가지
피보나치 수열 dp[N] = dp[N-1] + dp[N-2]
시간 초과 => 재귀 반복
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
dp = new int[N + 1];
dp[0] = 0;
System.out.println(cal(N));
}
private static int cal(int num) {
if (num == 1) {
return 1;
} else if (num == 2) {
return 2;
} else {
dp[num] = (cal(num - 1) + cal(num - 2)) % 15746;
return dp[num];
}
}
}
런타임 에러 => N=1일 경우 dp[2] 인덱스 범위 초과
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] dp = new int[N + 1];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= N; i++) {
dp[i] = (dp[i - 1] + dp[i - 2]) % 15746;
}
System.out.println(dp[N]);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N;
static int[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
dp = new int[N + 1];
dp[0] = 0;
System.out.println(cal(N));
}
private static int cal(int num) {
if (dp[num] != 0) { // 이미 계산된 값이 있는 경우 추가
return dp[num];
}
if (num == 1) {
return dp[1] = 1;
} else if (num == 2) {
return dp[2] = 2;
} else {
dp[num] = (cal(num - 1) + cal(num - 2)) % 15746;
return dp[num];
}
}
}