For Programmer
백준 1463번 파이썬 문제풀이(DP - 1로 만들기) 본문
728x90
코드
X = int(input())
dp = [0] * (X + 1) # 각 인덱스(1~X)마다 1을 만들기위한 연산 횟수를 저장할 DP배열 선언,
# d[1] = 0 인이유는 1일때는 연산 횟수가 0이기 때문이다.
# 2일때부터 n번째 일때까지 몇번을 시행해야하는지 체크
for i in range(2, X + 1):
# -1 했을 때의 횟수 저장
dp[i] = dp[i - 1] + 1 # 일단 처음에 그 전에 시행했던 횟수(d[i-1])에서 +1 만해주면 되기 때문에 d[i] = 전의횟수(d[i-1]) + 1
# 3으로 나눴을 때의 횟수저장
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1) # 만약 3으로 나누어 진다면 6은 2일때의 횟수에서 + 1 만 하면 되기 때문에
# 2로 나눳을 때의 횟수저장
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1) # 만약 2로 나누어진다면 4는 2일때의 횟수에서 + 1 만 하면 되기 때문에
print(dp[X]) # 해당 X번째의 횟수 출력
-> 위 문제는 DP의 아주 기본적인 문제라고 할 수 있다. 이 문제를 처음 DP를 모르고 풀 때는 입력받은 X값에서 자꾸 1로 내려갈라고 생각을 했다. 그러니 자꾸 시간초과가 발생했다. 위 문제는 반대로 1부터 입력받은 X까지 횟수를 올려가며 저장을 해야하는 문제이다. 위의 코드에서 자세한 설명을 해놨으니 주석을 보면 쉽게 이해할 수 있다고 생각한다.
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 11727번 파이썬 문제풀이(DP - 2*n 타일링 2) (0) | 2021.10.29 |
---|---|
백준 11726번 파이썬 문제풀이(DP - 2*n 타일링) (0) | 2021.10.28 |
백준 14391번 파이썬 문제풀이(브루트 포스 - 종이 조각) (0) | 2021.10.27 |
백준 1182번 파이썬 문제풀이(브루트 포스 - 부분수열의 합) (0) | 2021.10.26 |
백준 6603번 파이썬 문제풀이(브루트 포스 - 로또) (0) | 2021.10.26 |
Comments