Algorithm

[Algorithm] 개미 전사

씬프 2021. 5. 19. 09:00
반응형

문제

개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있다. 각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다.

예를 들어 식량 창고 4개가 다음과 같이 존재한다고 가정하자.

 

{ 1, 3, 1, 5 }

 

이때 개미 전사는 두번째 식량창고와 네번째 식량창고를 선택했을 때 최대값인 총 8개의 식량을 빼앗을 수 있다. 개미 전사는 식량창고가 이렇게 일직선 상일 때 최대한 많은 식량을 얻기 원한다.

개미 전사를 위해 식량창고 N개에 대한 정보가 주어졌을 때 얻을 수 있는 식량의 최대값을 구하는 프로그램을 작성하시오.

 

입력 조건

첫번째 줄에 식량창고의 개수 N이 주어진다.

두번째 줄에 각 식량창고에 저장된 식량의 개수 K가 주어진다.

 

출력 조건

개미 전사가 얻을 수 있는 식량의 최대값을 출력하시오.

 

풀이

먼저, X개의 식량창고를 약탈했을 때 약탈한 식량의 갯수는 X-1개의 식량창고를 약탈했을 때 식량에 X번째 식량창고의 식량이다. (X-1와 X의 연관성) 그리고, X개의 식량창고를 약탈할 때까지 최대를 구하기 위해, 재귀적으로 구한다면 중복되는 값을 계속해서 구하게 된다. (중복된 호출 반복) 이 문제는 다이나믹 프로그래밍으로 해결한다. (바텀업)

 

import java.util.*;

class Main {

  public static void main(String[] args) {
    
    int[] d = new int[100];

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] store = new int[n];
    for(int i = 0; i < n; i++) {
      store[i] = sc.nextInt();
    }
    sc.close();

    // 왼쪽부터 일직선으로 약탈한다고 가정한다.
    // x번째 식량창고를 약탈할 때, 
    // x-1번째 식량창고 약탈한 식량과
    // x-2번째 식량창고까지 약탈한 식량 + x번째 식량창고 식량
    // 값을 비교해 더 큰 값을 저장한다.
    // 2개 이상의 식량창고를 건너뛰는 것은 더 손해.
    d[0] = store[0];
    d[1] = Math.max(store[0], store[1]);
    for (int i = 2; i < n; i++) {
      d[i] = Math.max(d[i-1], d[i-2] + store[i]);
    }
    System.out.println(d[n-1]);

  } // end main
}

 

'Algorithm' 카테고리의 다른 글

[Algorithm] 효율적인 화폐 구성  (0) 2021.05.21
[Algorithm] 바닥 공사  (0) 2021.05.20
[Algorithm] 1로 만들기  (0) 2021.05.18
[Algorithm] 떡볶이 떡 만들기  (0) 2021.05.17
[Algorithm] 부품 찾기  (0) 2021.05.16