TIL/Baekjoon

[16198] 에너지 모으기

YOOZI. 2025. 3. 23. 20:47
728x90

문제

백준 문제

 

N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다.

i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있다.

  1. 에너지 구슬 하나를 고른다. 고른 에너지 구슬의 번호를 x라고 한다. 단, 첫 번째와 마지막 에너지 구슬은 고를 수 없다.
  2. x번째 에너지 구슬을 제거한다.
  3. Wx-1 × Wx+1의 에너지를 모을 수 있다.
  4. N을 1 감소시키고, 에너지 구슬을 1번부터 N번까지로 다시 번호를 매긴다. 번호는 첫 구슬이 1번, 다음 구슬이 2번, ... 과 같이 매겨야 한다.

N과 에너지 구슬의 무게가 주어졌을 때, 모을 수 있는 에너지 양의 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 에너지 구슬의 개수 N(3 ≤ N ≤ 10)이 주어진다.

둘째 줄에는 에너지 구슬의 무게 W1, W2, ..., WN을 공백으로 구분해 주어진다. (1 ≤ Wi ≤ 1,000)

출력

첫째 줄에 모을 수 있는 에너지의 최댓값을 출력한다.

예제 입력 1 

4
1 2 3 4

예제 출력 1 

12

예제 입력 2 

5
100 2 1 3 100

예제 출력 2 

10400

예제 입력 3 

7
2 2 7 6 90 5 9

예제 출력 3 

1818

예제 입력 4 

10
1 1 1 1 1 1 1 1 1 1

예제 출력 4 

8

풀이

import sys

def backtrack(energy, beads):
    global max_energy
    
    if len(beads) == 2:  # 구슬이 2개 남으면 종료 (양 끝만 남음)
        max_energy = max(max_energy, energy)
        return

    for i in range(1, len(beads) - 1):  # 첫 번째와 마지막 구슬 제외하고 선택
        gain = beads[i - 1] * beads[i + 1]  # 에너지 계산
        new_beads = beads[:i] + beads[i + 1:]  # i번째 구슬 제거
        backtrack(energy + gain, new_beads)  # 다음 단계 탐색

def solve():
    global max_energy
    n = int(sys.stdin.readline())
    beads = list(map(int, sys.stdin.readline().split()))

    max_energy = 0
    backtrack(0, beads)  # 초기 에너지는 0
    print(max_energy)

solve()

 


728x90

'TIL > Baekjoon' 카테고리의 다른 글

[15650] N과 M(2)  (0) 2025.03.23
[15649] N과 M(1)  (0) 2025.03.23
[9237] 이장님 초대  (0) 2025.03.19
[11047] 동전 0  (0) 2025.03.19
[14916] 거스름돈  (0) 2025.03.19