코딩테스트
[파이썬(python)] 이것이 취업을 위한 코딩테스트다 1로 만들기
고후
2022. 3. 3. 17:24
이 문제는 다이나믹 프로그래밍을 연습하기위해 푼 문제다.
처음 작성한 코드는 아래와 같은데, 나중에 d 배열을 출력할 때
7, 11, 13, 17 등 소수에 대해서만 0값이 출력된다는 문제가 있다.
n에 대한 값은 정확히 출력된다.
아. 밑의 코드는 d[n]만 정확히 구하기 위한 함수로서, 7, 11, 13 등의 소수는 호출되지 않는다.
그렇다면 반복문을 이용하여 1~n에 대해 모두 정확히 구하려면 코드를 개선해야한다.
x = int(input())
d = [0] * (x+1)
def mincount(n):
if n == 1:
return 0
if d[n] != 0:
return d[n]
if n % 5 == 0:
d[n] = min(mincount(n//5) + 1, mincount(n-1) + 1)
return d[n]
if n % 3 == 0:
d[n] = min(mincount(n//3) + 1, mincount(n-1) +1)
return d[n]
if n % 2 == 0:
d[n] = min(mincount(n//2) + 1, mincount(n-1) + 1)
return d[n]
return mincount(n-1) + 1
print(mincount(x))
코드 개선
반복문을 활용하여 작은수부터 배열을 채워나가면 빠뜨리는 수 없이 정확히 x값까지 계산할수있다!
x = int(input())
d = [0] * (x+1)
for i in range(2, x+1):
if i % 5 == 0:
d[i] = min(d[i//5] + 1, d[i-1]+1)
continue
if i % 3 == 0:
d[i] = min(d[i//3]+1, d[i-1]+1)
continue
if i % 2 == 0:
d[i] = min(d[i//2]+1, d[i-1]+1)
continue
d[i] = d[i-1] + 1
print(d)
답지를 보고 개선한 코드
이렇게 하면 같은 코드를 줄일수있다.
x = int(input())
d = [0] * (x+1)
for i in range(2, x+1):
d[i] = d[i-1] + 1
if i % 5 == 0:
d[i] = min(d[i//5] + 1, d[i])
if i % 3 == 0:
d[i] = min(d[i//3] + 1, d[i])
if i % 2 == 0:
d[i] = min(d[i//2] + 1, d[i])
print(d)