https://www.acmicpc.net/problem/1463
다이나믹 프로그래밍 유형으로 초반에 노가다를 하여 규칙을 찾아내 앞의 값을 이용하여 푸는 문제이다.
중복 조건일때, 최솟값에 1을 더해주도록 찾아나갔다.
using System;
using System.Text;
namespace B1463
{
class Program
{
static void Main()
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int n = int.Parse(sr.ReadLine());
int[] dp = new int[1000001];
dp[2] = 1;
dp[3] = 1;
if (n >= 4)
{
for (int i = 4; i <= n; i++)
{
if (i % 3 == 0 && i % 2 == 0)
{
dp[i] = (dp[i / 3] > dp[i / 2] ? dp[i / 2] : dp[i / 3]) + 1;
//if () dp[i] = dp[i / 2] + 1;
//else dp[i]= dp[i / 3] + 1;
}
else if (i % 3 == 0)
{
dp[i] = (dp[i - 1] > dp[i / 3] ? dp[i / 3] : dp[i - 1]) + 1;
//if (dp[i - 1] > dp[i / 3]) dp[i] = dp[i / 3] + 1;
//else dp[i] = dp[i - 1] + 1;
}
else if (i % 2 == 0)
{
dp[i] = (dp[i - 1] > dp[i / 2] ? dp[i / 2] : dp[i - 1]) + 1;
//if (dp[i - 1] > dp[i / 2]) dp[i] = dp[i / 2] + 1;
//else dp[i] = dp[i - 1] + 1;
}
else dp[i] = dp[i - 1] + 1;
}
}
sw.Write(dp[n]);
sr.Close();
sw.Flush();
sw.Close();
}
}
}
제출 코드
using System;
using System.Text;
namespace B1463
{
class Program
{
static void Main()
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int n = int.Parse(sr.ReadLine());
int[] dp = new int[1000001];
dp[2] = 1;
dp[3] = 1;
if (n >= 4)
{
for (int i = 4; i <= n; i++)
{
if (i % 3 == 0 && i % 2 == 0) dp[i] = (dp[i / 3] > dp[i / 2] ? dp[i / 2] : dp[i / 3]) + 1;
else if (i % 3 == 0) dp[i] = (dp[i - 1] > dp[i / 3] ? dp[i / 3] : dp[i - 1]) + 1;
else if (i % 2 == 0) dp[i] = (dp[i - 1] > dp[i / 2] ? dp[i / 2] : dp[i - 1]) + 1;
else dp[i] = dp[i - 1] + 1;
}
}
sw.Write(dp[n]);
sr.Close();
sw.Flush();
sw.Close();
}
}
}
'알고리즘 > 백준 BOJ' 카테고리의 다른 글
[ BOJ/C# ] 1003 피보나치 함수 (0) | 2023.09.21 |
---|---|
[ BOJ/C# ] 9095 1, 2, 3 더하기 (0) | 2023.09.19 |
[ BOJ/C# ] 11723 집합 (0) | 2023.09.18 |
[ BOJ/C# ] 17219 비밀번호 찾기 (0) | 2023.09.16 |
[ BOJ/C# ] 11399 ATM (0) | 2023.09.16 |