Skip to content

Commit

Permalink
Update 221218-1463.md
Browse files Browse the repository at this point in the history
  • Loading branch information
srlee056 committed Dec 18, 2023
1 parent f8e334f commit d8a5324
Showing 1 changed file with 63 additions and 3 deletions.
66 changes: 63 additions & 3 deletions content/post/CodingTest/221218-1463.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,81 @@
+++
author = "Seorim"
title = "221218 1463"
title = "백준 : [Silver III] 1로 만들기 - 1463"
slug = "221218-1463"
date = 2023-12-18T12:05:39+09:00

categories = [
"CodingTest",
]
tags = [
"",
"Silver III", "DP",
]
+++

[GitHub Link]()
[GitHub Link](https://github.com/srlee056/algorithm-study/tree/main/%EB%B0%B1%EC%A4%80/Silver/1463.%E2%80%851%EB%A1%9C%E2%80%85%EB%A7%8C%EB%93%A4%EA%B8%B0)

# 문제 설명

<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>

# 풀이 코드

```python

import sys


def update_counts(v, value_with_counts, count):
old_count = value_with_counts.get(v, count)
value_with_counts[v] = min(old_count, count)


n = int(sys.stdin.readline())

value_with_counts = {n: 0}

while value_with_counts:
v = max(value_with_counts)
c = value_with_counts.pop(v)
if v <= 1:
print(c)
break

if v % 3 == 0:
update_counts(v // 3, value_with_counts, c + 1)
elif v % 3 == 1:
update_counts((v - 1) // 3, value_with_counts, c + 2)
else:
update_counts((v - 2) // 3, value_with_counts, c + 3)

if v % 2 == 0:
update_counts(v // 2, value_with_counts, c + 1)
else:
update_counts((v - 1) // 2, value_with_counts, c + 2)

```

# CHECK!

- 시간초과를 막기 위해, 3과 2로 나누어지지 않을 때는 나머지만큼 뺀 후 나누는 방식으로 진행
- 매번 1을 뺀 값을 리스트에 더하는 것 보다 경우의 수가 줄게 됨

<br>

- 중복된 코드 제거를 위해 update_counts 함수를 만듬

0 comments on commit d8a5324

Please sign in to comment.