[Python]알고리즘/이코테 2021

[다이나믹 프로그래밍] ▲ 문제2 - 개미 전사(220p)

HSY_mumu 2022. 4. 19. 17:01
728x90

[이코테] 문제2 - 개미 전사(220p)

(한줄평) 다이나믹 프로그래밍을 풀어야함을 알고 점화식을 도출해낼 수있는 능력을 요구하는 문제로 복습이 꼭 필요한 문제!



(풀이1) 내 풍이

풀이 시간: 30분 이내

1) 문제 해결 아이디어

처음에 내가 생각해냈던 아이디어는 창고 최대 개수인 100개 크기로 생성한 리스트(d)에 해당 번호의 창고를 털었을 때 얻을 수 있는 식량의 최댓값을 기록하는 것이었다.

사실 예제로는 답이 맞게 나오는데 정확히 맞는 코드인지는 모르겠다....

 

2) 소스코드

n = int(input())  # 창고 개수
graph = list(map(int, input().split()))  # n개의 식량 개수

d = [0] * 100
d[0], d[1] = graph[0], graph[1]

# i번째 창고 털기
for i in range(2, n):
  d[i] = max(d[: i - 1]) + graph[i]

print(max(d))

 

(풀이2) 책 풀이

풀이 시간: 

1) 문제 해결 아이디어

기본 아이디어는 내 풀이와 똑같다. 다만 점화식을 세운 부분에 차이가 조금 있다.

 

<점화식>

이 문제는 인접한 창고는 털 수 없다는 점에서 경우의 수를 어떻게 나눌 수 있는지 떠올리는 것이 핵심이다!

그러므로 i번째 창고를 털 수 있을지 없을지i - 1번째를 털었을 경우 i - 2번째 창고를 털었을 경우(i - 1 번째를 털지 않았을 경우) 2가지 경우로 나누어 생각해 볼 수 있다.2가지 경우 중 최댓값을 i번째 식량창고까지 얻을 수 있는 최대 식량 값으로 설정하면된다.

 

1. i - 1 번째를 털었을 경우,

i번째는 인접했으므로 털 수 없게되어 그대로 i - 1번째 값이 될 것이고

2. i - 2 번째를 털었을 경우,

i번째는 인접하지않았으므로 털 수 있게 되므로 i - 2번째 값에 현재 i번째 창고의 식량 개수를 더한 값이 된다.

 

2) 소스코드

n = int(input())  # 창고 개수
graph = list(map(int, input().split()))  # n개의 식량 개수

d = [0] * 100
d[0] = graph[0]
d[1] = max(graph[0], graph[1])  # 둘 중 최댓값
for i in range(2, n):
  d[i] = max(d[i - 1], d[i - 2] + graph[i])

print(d[n - 1])
728x90