-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* ************************************************************************** */ | ||
/* */ | ||
/* ::: ::: ::: */ | ||
/* Problem Number: 1463 :+: :+: :+: */ | ||
/* +:+ +:+ +:+ */ | ||
/* By: fkdl4878 <boj.kr/u/fkdl4878> +#+ +#+ +#+ */ | ||
/* +#+ +#+ +#+ */ | ||
/* https://boj.kr/1463 #+# #+# #+# */ | ||
/* Solved: 2024/06/20 00:16:03 by fkdl4878 ### ### ##.kr */ | ||
/* */ | ||
/* ************************************************************************** */ | ||
|
||
// 정수 x에 대해서 1로 만드는 문제 | ||
// 사용할 수 있는 연산은 3가지 | ||
// x가 3으로 나눠 떨어지면 3으로 나눈다. | ||
// x가 2로 나눠 떨어지면 2로 나눈다. | ||
// 1을 뺀다. | ||
// 이 연산을 사용해서 1로 만들 때 최소한의 연산을 사용 | ||
// 각각 연산 함수를 만들고 이를 계산 함수에서 활용하여 계산 | ||
|
||
// ps1 | ||
// dp 문제이기 때문에 dp로 풀어야 함 | ||
// 먼저 0~5까지 dp를 입력값에 넣어줌 | ||
// 이후 6부터는 반복으로 만들어야 함 N까지 | ||
// 6의 경우 2 -> 1 총 두 번의 연산이 필요하다. | ||
// 따라서 dp[3] + dp[2]의 연산 | ||
// 전 결과를 가져오기 위해서 전 계산의 조합으로 구성됨 | ||
// 7의 경우 7 -> 6 -> 2 -> 1 | ||
// dp로는 아마 dp[6] + | ||
// 즉, | ||
|
||
#include <bits/stdc++.h> | ||
|
||
using namespace std; | ||
|
||
int solve(int n) | ||
{ | ||
vector<int> dp(n + 1, 0); | ||
|
||
// dp 수행.. | ||
for (int i = 2; i <= n; i++) | ||
{ | ||
dp[i] = dp[i - 1] + 1; | ||
if (i % 2 == 0) | ||
dp[i] = min(dp[i], dp[i / 2] + 1); | ||
if (i % 3 == 0) | ||
dp[i] = min(dp[i], dp[i / 3] + 1); | ||
} | ||
|
||
// 결과 출력 | ||
return dp[n]; | ||
} | ||
|
||
int main() | ||
{ | ||
int n; | ||
|
||
cin >> n; | ||
|
||
cout << solve(n); | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# 1463번: 1로 만들기 - <img src="https://static.solved.ac/tier_small/8.svg" style="height:20px" /> Silver III | ||
|
||
<!-- performance --> | ||
|
||
<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.--> | ||
|
||
<!-- end --> | ||
|
||
## 문제 | ||
|
||
[문제 링크](https://boj.kr/1463) | ||
|
||
|
||
<p>정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.</p> | ||
|
||
<ol> | ||
<li>X가 3으로 나누어 떨어지면, 3으로 나눈다.</li> | ||
<li>X가 2로 나누어 떨어지면, 2로 나눈다.</li> | ||
<li>1을 뺀다.</li> | ||
</ol> | ||
|
||
<p>정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.</p> | ||
|
||
|
||
|
||
## 입력 | ||
|
||
|
||
<p>첫째 줄에 1보다 크거나 같고, 10<sup>6</sup>보다 작거나 같은 정수 N이 주어진다.</p> | ||
|
||
|
||
|
||
## 출력 | ||
|
||
|
||
<p>첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.</p> | ||
|
||
|
||
|
||
## 소스코드 | ||
|
||
[소스코드 보기](1로%20만들기.cpp) |