스쳐가는비
devtravel
스쳐가는비
전체 방문자
오늘
어제
  • 분류 전체보기 (108)
    • 🎵 Daily (0)
    • 📚 Computer Science (11)
      • Algorithm (9)
      • Design Pattern (2)
    • 🔥 Programming (23)
      • C# (3)
      • C++ (5)
      • WPF (0)
      • Python (1)
      • OpenCV (9)
      • ML & DL (5)
    • 🔥 Web (13)
      • HTML (6)
      • JavaScript (7)
    • 📌 Tool (2)
      • Git (2)
      • Etc (0)
    • 📖 Certificate (10)
      • 컴활 1급 (2)
      • SQL 개발자 (2)
      • 리눅스 마스터 (0)
      • 정보처리기사 (0)
      • 사무자동화산업기사 (0)
      • ADsP (6)
    • 💻 OnlineJudge (49)
      • Baekjoon (49)
      • GoormEdu (0)
GitHub Contribution
Loading data ...

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
스쳐가는비

devtravel

[백준 / BOJ] C++ 1463 1로 만들기
💻 OnlineJudge/Baekjoon

[백준 / BOJ] C++ 1463 1로 만들기

2023. 1. 10. 20:28

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

 

1463번: 1로 만들기

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

www.acmicpc.net

문제

 

풀이

문제에서 주어지는 조건은 3가지이다.

 

1. X가 3으로 나누었을때 나누어 떨어지면 3으로 나눈다.

2. X가 2로 나누었을때 나누어 떨어지면 2로 나눈다.

3. 그냥 1을 뺀다.

 

예시로 확인해보자.

 

1의 경우는 연산작업이 필요가 없기에 연산 수는 0

2의 경우는 2로 나누어떨어지기에 연산 횟수는 1

3의 경우는 3으로 나누어 떨어지기에 연산회수는 1

10의 경우에는 (10 - 1) / 3 / 3의 연산을 해야하기에 연산 횟수는 3

 

이를 따라, 점화식을 구해보자면

 

2의 경우는 

dp[i] = dp[i/2] + 1; 

3의 경우는

dp[i] = dp[i/3] + 1;

10의 경우는 

dp[i] = dp[i-1] + 1과 dp[i] = dp[i/3] + 1;을 함께사용하였다.

 

즉

dp[i] = dp[i/2] + 1; 

dp[i] = dp[i/3] + 1;

dp[i] = dp[i-1] + 1;

 

세가지의 점화식을 구할 수 있다.

 

여기서 끝에 + 1을 더해주는 것은 결국 2또는 3으로 나누었을때 연산과 - 1 을 해주었을때 연산 카운트라고 보면 된다.

 

아래 코드를 확인해보자.

 

Code ( C++ )

#include <iostream>
#define MAX 1000001
using namespace std;

int N;
int dp[MAX];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N;

	for (int i = 2; i <= N; i++)
	{
		dp[i] = dp[i - 1] + 1;

		if (i % 2 == 0)
		{
			if (dp[i] >= dp[i / 2] + 1)
				dp[i] = dp[i / 2] + 1;
		}
		if (i % 3 == 0)
		{
			if (dp[i] >= dp[i / 3] + 1)
				dp[i] = dp[i / 3] + 1;
		}
	}

	cout << dp[N];
}

'💻 OnlineJudge > Baekjoon' 카테고리의 다른 글

[백준 / BOJ] C++ 1764 듣보잡  (0) 2023.03.04
[백준 / BOJ] C++ 1676 팩토리얼 0의 개수  (0) 2023.02.01
[백준 / BOJ] C++ 2798 블랙잭  (0) 2022.12.15
[백준 / BOJ] C++ 1107 리모컨  (0) 2022.12.15
[백준 / BOJ] C++ 1003 피보나치 함수  (0) 2022.12.11
    '💻 OnlineJudge/Baekjoon' 카테고리의 다른 글
    • [백준 / BOJ] C++ 1764 듣보잡
    • [백준 / BOJ] C++ 1676 팩토리얼 0의 개수
    • [백준 / BOJ] C++ 2798 블랙잭
    • [백준 / BOJ] C++ 1107 리모컨
    스쳐가는비
    스쳐가는비
    The biggest risk is not taking any risk

    티스토리툴바