일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- leetcode
- 증가하는부분수열
- a*
- 동적계획법
- 합성곱
- DFS
- Increasing Triplet Subsequence
- convolution
- deeplearning
- NeuralNetwork
- 신경망
- 지도학습
- CNN
- 8puzzle
- residualnetwork
- residuallearning
- SRCNN
- sr
- MDSR
- superresolution
- RESNET
- EDSR
- 딥러닝
- pixelshuffle
- PYTHON
- BFS
- 준지도학습
- 비지도학습
- AStar
Archives
- Today
- Total
이것저것 코딩하는 블로그
[Algorithm] 숫자 암호 만들기 (password) 본문
0. 문제
link: https://www.codetree.ai/missions/6/concepts/35/problems/dp-number-pass/description
주어진 숫자를 쪼개어 암호를 만들려고 한다. 암호를 만드는 과정은 다음과 같다.
1. 숫자를 1, 2, 3, 4의 합으로 바꾼다.
2. 숫자의 합에서 사용된 숫자를 일렬로 나열한다.
일례로, 3을 활용하면
1+1+1 = 111
2+1 = 21
1+2 =12
3 = 3
4개의 암호를 만들 수 있다. 숫자 n이 주어졌을 때 만들 수 있는 암호의 가짓수를 구해보자.
1. 풀이
이는 동적 계획법으로 해결할 수 있다. dp[i]를 i로 만들 수 있는 암호의 가짓수라고 하면, dp[i-1], ..., dp[i-4] 의 뒤에 1, 2, 3, 4를 각각 붙이기만 하면 되기 때문이다. 순서를 고려하는 것 때문에 헷갈릴 수 있는데, 어차피 그 순서는 dp[i-k]에서 다 고려해놨다.
따라서 dp[i] += dp[i-k] (for k in range(4)) 가 되겠다.
초기화가 중요한 문제인데, 나머지는 아직 구하지 않았으니 0으로 설정해도, dp[0]을 어떻게 설정하느냐가 관건이다.
아무것도 사용하지 않아 빈 문자열이 나온 경우를 1로 간주해주는 것이 중요하다. 그래야 dp[1] = dp[1] + dp[0] 이 되어서 dp[1] = 1이라는 값을 도출할 수 있다.
2. 구현
n = int(input())
dp = [0 for i in range(n+1)]
nums = [1, 2, 3, 4]
dp[0] = 1
# 4는 단독으로 표현되지 않기 때문에 base를 4까지 넣어줘야 한다.
for i in range(5, n+1):
for num in nums:
if i - num >= 0:
dp[i] += dp[i - num]
print(dp)
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Algorithm] Knapsack Problem (0) | 2021.10.12 |
---|---|
[Algorithm] Edit Distance (편집 거리) (0) | 2021.10.12 |
[Algorithm] LCS (Longest Common Subsequence) (0) | 2021.10.12 |
[Algorithm] 감소하는 부분 수열 (0) | 2021.10.12 |
[Algorithm] Bank Problem (동전 문제) (0) | 2021.10.12 |
Comments