갬미의 성장일기
[이것이 코딩테스트다] 18일차 - DP 예제풀이 | 1로 만들기, 개미 전사 본문
본문은 [이것이 취업을 위한 코딩테스트다 - 나동빈] 책을 공부하고 작성한 글입니다.
Chapter 8 다이나믹 프로그래밍
오늘 풀이한 문제 - 다이나믹 프로그래밍 예제
[이코테 217p] 1로 만들기
문제
정수 X가 주어질때 X에 사용할 수 있는 연산은 다음과 같이 4가지이다.
- X가 5로 나누어떨어지면, 5로 나눈다
- X가 3으로 나누어떨어지면, 3으로 나눈다
- X가 2로 나누어떨어지면, 2로 나눈다
- X에서 1을 뺀다
정수 X가 주어졌을때, 연산 4개를 적절히 사용하여 1을 만들으려한다. 연산을 사용하는 횟수의 최솟값을 출력하시오
접근 방법
X=6이라고 하면 이는 다음과 같이 부분구조로 나눌수있다
당장 나누기 연산이 가장 작은 값을 반환해도 각 연산 결과를 적절하게 섞었을때 최적의 결과를 얻을 수 있다
d 리스트는 연산 횟수를 저장하는 곳이다
1의 경우 계산할 필요가 없으니 0으로 초기화하고 for문은 2부터 시작한다
2,3,5로 수를 나누는 경우는 나누어 떨어질때만 진행하기때문에
- 일단 1을 빼는 연산을 먼저하고
- 2,3,5로 나누어 떨어질때 1을 뺀값과 비교하여 작은것을 d에 저장한다
- 연산후 1 더하는 것은 연산횟수를 카운트 하는것
소스 코드
x = int(input())
# DP 테이블
d = [0] * (x+1)
for i in range(2, x+1):
d[i] = d[i-1] + 1
if i % 2 == 0:
d[i] = min(d[i], d[i//2] + 1)
if i % 3 == 0:
d[i] = min(d[i], d[i//3] + 1)
if i % 5 == 0:
d[i] = min(d[i], d[i//5] + 1)
print(d[x])
[이코테 220p] 개미 전사
문제
개미전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있다. 각 식량창고에는 정해진 수의 식량을 저장하고 있ㄷ으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다.
예를 들어 식량창고 4개가 다음과 같이 존재한다고 가정하자.
{1, 3, 1, 5}
이때 개미 전사는 두 번째 식량창고와 네 번째 식량창고를 선택했을 때 최댓값인 총 8개의 식량을 빼앗을 수 있다. 개미 전사는 식량창고가 이렇게 일직선상일 때 최대한 많은 식량을 얻기를 원한다.
개미 전사를 위해 식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최댓값을 구하는 프로그램을 작성하시오.
접근 방법
d = 식량창고에서 훔친 식량의 수를 저장하는 리스트
d[i]는 i번째 식량창고를 털 때까지 가장 많이 훔칠수 있는 식량의 양이므로
i번째에서 식량을 털때 고려해야할 사항은 i-2와 i-1이다
지금 i에서 식량을 턴다 -> i번째 식량 + i-2 번째 식량이 i-1번째 식량보다 많다
i에서 식량을 털지않는다 -> i번째 식량 + i-2 번째 식량이 i-1번째 식량보다 적다
이를 점화식으로 표현하면
a = i번째 식량창고를 털 때까지 가장 많이 훔칠수 있는 식량의 양
k = i번째 식량창고에 있는 식량의 양
소스 코드
# n = int(input())
# data = list(map(int, input().split()))
n = 4
data = [1,3,1,5]
d = [0]*(n)
d[0] = data[0]
d[1] = max(data[0], data[1])
for i in range(2,n):
d[i] = max(d[i-1], d[i-2] + data[i])
print(d[n-1])
유튭 강의를 듣고 이제야 이해했다!
'Algorithm > Algorithm Study' 카테고리의 다른 글
[이것이 코딩테스트다] 20일차 - DP 문제풀이 | 금광, 정수삼각형, 퇴사, 병사 배치하기 (0) | 2021.12.23 |
---|---|
[이것이 코딩테스트다] 19일차 - DP 예제풀이 | 효율적인 화폐구성, 바닥 공사 (0) | 2021.12.22 |
[이것이 코딩테스트다] 18일차 - 다이나믹 프로그래밍(DP) (0) | 2021.12.20 |
[이것이 코딩테스트다] 17일차 - 이진탐색 예제 | 고정점 찾기 , 백준 - 공유기 설치 (0) | 2021.12.20 |
[이것이 코딩테스트다] 16일차 - 이진탐색 예제 | 정렬된 배열에서 특정 수의 개수 구하기 (0) | 2021.12.19 |