본문 바로가기
알고리즘/백준 BOJ

[ BOJ/C# ] 1463 1로 만들기

by 왹져박사 2023. 9. 18.
728x90

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

다이나믹 프로그래밍 유형으로 초반에 노가다를 하여 규칙을 찾아내 앞의 값을 이용하여 푸는 문제이다. 

중복 조건일때, 최솟값에 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();
        }
    }
}

728x90

'알고리즘 > 백준 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