Skip to content

Commit

Permalink
BOJ-EX: 6/20/2024, 12:55:37 AM
Browse files Browse the repository at this point in the history
  • Loading branch information
fkdl0048 committed Jun 19, 2024
1 parent 07f80e2 commit 2362df3
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 0 deletions.
61 changes: 61 additions & 0 deletions 1463번: 1로 만들기/1로 만들기.cpp
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 added 1463번: 1로 만들기/1로 만들기.exe
Binary file not shown.
42 changes: 42 additions & 0 deletions 1463번: 1로 만들기/README.md
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)

0 comments on commit 2362df3

Please sign in to comment.