일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- grad-cam
- Artificial Intelligence
- 백준
- coding test
- 머신러닝
- Deep learning
- python
- Machine Learning
- 딥러닝
- keras
- meta-learning
- 설명가능한
- Class activation map
- 메타러닝
- GAN
- cs231n
- 코딩테스트
- Explainable AI
- SmoothGrad
- xai
- AI
- 설명가능한 인공지능
- 코딩 테스트
- 기계학습
- 시계열 분석
- Score-CAM
- Cam
- 인공지능
- Interpretability
- Unsupervised learning
Archives
- Today
- Total
iMTE
[백준1463, 다이나믹 프로그래밍] 1로 만들기 - Python 본문
타입 : 다이나믹 프로그래밍
문제 : 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력 : 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력 : 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
x = int(input()) # x 입력 받음
d = [0] * 1000001 # Dynamic programming table 선언
for i in range(2, x + 1): # d[1]은 고려할 필요 없이, 2~x 고려
d[i] = d[i - 1] + 1 # d[i-1]에서 1을 더하면 d[i]
if i % 2 == 0: # 2로 나누어지는 경우,
d[i] = min(d[i], d[i // 2] + 1) # d[i]와 d[i//2]+1 사이의 min 저장
if i % 3 == 0: # 3으로 나누어지는 경우,
d[i] = min(d[i], d[i // 3] + 1) # d[i]와 d[i//3]+1 사이의 min 저장
print(d[x]) # 최종 결과 출력
실행 결과 :
100
7
'Python > Coding test' 카테고리의 다른 글
[백준1753번, 다익스트라 알고리즘] 최단 경로 - Python (0) | 2021.09.16 |
---|---|
[백준11726, 다이나믹 프로그래밍] 2 x n 타일링 - Python (0) | 2021.09.14 |
[백준2805, 이분 탐색] 나무 자르기 - Python (0) | 2021.09.13 |
[백준1920번, 이진 탐색] 수찾기 - Python (0) | 2021.09.13 |
[ 백준2309번, 브루트포스, 정렬] 일곱 난쟁이 - Python (0) | 2021.09.10 |
Comments