본문 바로가기

Computer/Coding Test

코딩테스트 문제 (8) - 개미 전사

반응형

문제

개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 침입합니다. 식량창고는 정해진 수의 식량을 저장하고 있고 일직선으로 나열되어 있습니다. 메뚜기 정찰병은 인접한 식량창고가 공격받으면 바로 알아차릴 수 있습니다. 따라서, 개미 전사가 정찰병에게 들키지 않고 식량창고를 털기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 공격해야 합니다. 식량창고가 배열로 주어졌을 때, 개미 전사가 약탈할 수 있는 최대 식량을 구하는 문제입니다.

1. [1,3,1,5] => 8
2. [1,2,3,1] => 4
3. [2,7,9,3,1] => 12

 

풀이

1번 케이스의 [1,3,1,5]를 생각해보면, 개미가 첫 번째 인덱스를 (1) 약탈한다면 세 번째 인덱스 (1) 이나 네 번째 인덱스밖에 (5) 약탈할 수 없습니다. 이 경우 식량의 합은 6이 되겠네요. 두 번째 인덱스부터 (3) 약탈한다면 네 번째 인덱스밖에 (5) 약탈할 수 없으므로 식량의 합은 8이 됩니다. 따라서 8이 정답입니다.

배열 $a$의 원소가 $n$개 있다고 가정해 봅시다. 이 때 약탈할 수 있는 최대값은 어떻게 구할 수 있을까요? 최소한 한 칸 이상 떨어져야 되니 $n-1$에서의 식량 최대값과 $n-2$의 식량 최대값에서 $a_{n}$을 더한 값의 최대값이 되겠죠. 여기서 생각나는 부분은 바로 다이나믹 프로그래밍입니다.

  • 최적 부분 구조를 만족합니다. $n$에서의 식량 최대값을 하위 문제인 $n-1, n-2$에서의 식량 최대값을 통해 구할 수 있기 때문입니다.
  • 위의 하위 문제들은 중복됩니다.

kaggle.com의 notebook으로 작성한 풀이는 다음과 같습니다.

다이나믹 프로그래밍의 상향식 테뷸레이션으로 풀이했습니다.

 

홍머스 정리

  • 다이나믹 프로그래밍, tabulation
  • 난이도: 중, 바로 다이나믹 프로그래밍을 생각하기 쉽지 않다.

참조

반응형