




ex6) dp[6]
ex7) dp[7]

#include <iostream>
#include <algorithm>
using namespace std;
#define X -1
int dp[5010] = { 0, X, X, 1, X, 1 };
int N;
int main() {
	scanf("%d", &N);
	for (int i = 6; i <= N; i++) {
		if (dp[i - 3] == X && dp[i - 5] == X) {
			dp[i] = X;
			continue;
		}
		if (dp[i - 3] == X || dp[i - 5] == X) {
			dp[i] = max(dp[i - 3] + 1, dp[i - 5] + 1);
			continue;
		}
		dp[i] = min(dp[i - 3] + 1, dp[i - 5] + 1);
	}
	printf("%d", dp[N]);
}
#include <iostream>
#include <algorithm>
using namespace std;
#define X 5000
int dp[5010] = { 0, X, X, 1, X, 1 };
int N;
int main() {
	scanf("%d", &N);
	for (int i = 6; i <= N; i++)
		dp[i] = min(dp[i - 3] + 1, dp[i - 5] + 1);
	if (dp[N] >= X) {
		printf("-1");
		return 0;
	}
	printf("%d", dp[N]);
}
if (dp[N] >= X) {
    printf("-1");
    return 0;
}
따라서, 이 조건이 참이라면:
-> 이 조건문은 N을 3과 5로 나눌 수 없는 경우를 처리하는 부분입니다. 초기화 값 X (5000)를 사용하여 특정 값을 3과 5로 나눌 수 없는 경우를 나타내며, dp[N]이 이 값 이상이라면 -1을 출력하고 프로그램을 종료합니다. 그렇지 않다면 dp[N] 값을 출력하여 최소 횟수를 나타냅니다.
-> 위의 for문에서 `dp[i] = min(dp[i - 3] + 1, dp[i - 5] + 1);` 이 코드를 돌려서 dp[i-3]+1도, dp[i-5]+1 모두 X라면 dp[i] = X 이므로 이거를 다 모아서 나중에 if문으로 처리하는 것이다!!!