Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- remote repository 생성
- github
- 두수비교하기
- 함수
- ADD
- 1330
- commit
- 정규식
- GitHub 설치
- git
- python
- Baekjoon
- 수정사항업데이트
- Push
- git config global
- boostcamp #aI tech #주간리뷰
- 15596
- STAGE
- local repository 생성
- Restore
- 1
- Reset
- git commit
- git push
- amend
- 백준
- 파이썬
- regExr
Archives
- Today
- Total
Très bien
1로 만들기 본문
1로 만들기
◎ Problem Definition
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
◎ Implementation
1. Problem Type
- Dynamic Programming(Silver 3)
2. Problem Analysis
3으로 나누기, 2로 나누기, 1 빼기 의 수식을 최소한으로 활용하여 숫자 1로 만들기
- DP를 이용하여 다양한 경우의 수에 대한 최소 연산 횟수를 계산합니다.
3. Solution_1 (☆python)
▶ 완성 코드
# backjoon : #1463, MakeNumberOne
# date : 22th, July. 2022
# writer : Lemonsoda
# reference: https://www.acmicpc.net/problem/1463
# 정수 N이 주어졌을 때, 다음 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
# - X가 3으로 나누어 떨어지면, 3으로 나눈다.
# - X가 2로 나누어 떨어지면, 2로 나눈다.
# - 1을 뺀다.
N = int(input()) # 1 < N < 10^6
dp = [0] * (N+1)
def findmin(cur, next):
if dp[next] == 0:
cnt = dp[cur] + 1
else:
cnt = min(dp[next], dp[cur] + 1)
return cnt
num = N
while num > 1:
if num % 3 == 0:
dp[num // 3] = findmin(num, num//3)
if num % 2 == 0:
dp[num // 2] = findmin(num, num//2)
dp[num -1 ] = findmin(num, num-1)
num = num - 1
print(dp[1])
▶ 성능
4. Solution_2 (☆cpp)
▶ 완성 코드
// Reference : https://sparklenow.tistory.com/127, https://kau-algorithm.tistory.com/557
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<int>dp;
int main() {
int n;
cin >> n;
dp.assign(n + 1, -1);
dp[1] = 0;
for (int x = 2; x <= n; x++) {
int tmp = dp[x - 1] + 1;
if (x % 2 == 0)
tmp = min(tmp, dp[x / 2] + 1);
if (x % 3 == 0)
tmp = min(tmp, dp[x / 3] + 1);
dp[x] = tmp;
}
cout << dp[n];
return 0;
}
▶ 성능
◎ Results
- 이 문제는 약 7개월 전에 시도해 본 적이 있는 문제입니다만, 다시 보니 또 새롭습니다. 처음에는 3으로 나누어 떨어지는 연산의 횟수를 최소화하면 쉽게 답을 구할 수 있을 것이라 생각했습니다만, 세 연산의 적용을 검토하는 순서는 모든 가능성을 검토해야 하는 문제였습니다. 과거 코드를 확인해보니 Dynamic Programming으로 접근해서 풀었던 문제였습니다. 다시 DP를 이용하여 접근하여 해결했습니다. C/C++ 버전에서는 vector 구조체를 적용하여 유사한 구조로 풀었습니다.
'Coding > Algorithm' 카테고리의 다른 글
프린터 큐 (0) | 2022.06.25 |
---|---|
Baekjoon 2606 - 바이러스 (Python) (0) | 2022.02.25 |
Baekjoon 9020 - 골드바흐의 추측 (Python) (0) | 2022.02.21 |
BAEKJOON 11653 - 소인수분해 (0) | 2022.02.20 |
BAEKJOON 1978 - 소수 찾기 (0) | 2022.02.17 |
Comments