16198번: 에너지 모으기
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있
www.acmicpc.net
문제
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다.
i번째 에너지 구슬의 무게는 $W_i$이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있다.
- 에너지 구슬 하나를 고른다. 고른 에너지 구슬의 번호를 x라고 한다. 단, 첫 번째와 마지막 에너지 구슬은 고를 수 없다.
- x번째 에너지 구슬을 제거한다.
- $W_{x-1}$ × $W_{x+1}$의 에너지를 모을 수 있다.
- N을 1 감소시키고, 에너지 구슬을 1번부터 N번까지로 다시 번호를 매긴다. 번호는 첫 구슬이 1번, 다음 구슬이 2번, ... 과 같이 매겨야 한다.
N과 에너지 구슬의 무게가 주어졌을 때, 모을 수 있는 에너지 양의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 에너지 구슬의 개수 N(3 ≤ N ≤ 10)이 주어진다.
둘째 줄에는 에너지 구슬의 무게 $W_1, W_2, ..., W_N$을 공백으로 구분해 주어진다. (1 ≤ $W_i$ ≤ 1,000)
출력
첫째 줄에 모을 수 있는 에너지의 최댓값을 출력한다.
코드
n = int(input())
weights = list(map(int, input().split()))
ans = 0
def bt(w, total):
global ans
if len(w) < 3:
ans = max(ans, total)
return
for i in range(1, len(w)-1):
bt(w[:i]+w[i+1:], total+(w[i-1]*w[i+1]))
bt(weights, 0)
print(ans)
- bt()
- 입력으로 받은 w 배열에서 처음과 끝의 원소는 제외하고 인덱스 1인 원소부터 제거해보며 최대로 에너지를 모은다.
- w의 길이가 3 미만이라면 처음과 끝의 원소를 제외하면 뽑을 원소가 없으므로 이때까지 누적된 total을 ans와 비교하여 둘 중 큰 값을 ans에 저장하고 리턴한다.
N의 범위가 3 ≤ N ≤ 10으로 크지 않기 때문에 모든 경우의 수를 모두 시행해보도록 하였다.
'문제풀이 > 백트래킹' 카테고리의 다른 글
[Python/파이썬] 백준 20208번 진우의 민트초코우유 (0) | 2024.02.07 |
---|---|
[Python/파이썬] 백준 18429번 근손실 (0) | 2024.01.15 |
[Python/파이썬] 백준 17255번 N으로 만들기 (0) | 2024.01.01 |
[Python/파이썬] 백준 1189번 컴백홈 (0) | 2023.12.28 |
[Python/파이썬] 백준 6603번 로또 (0) | 2023.12.24 |
16198번: 에너지 모으기
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다. i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있
www.acmicpc.net
문제
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다.
i번째 에너지 구슬의 무게는 $W_i$이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있다.
- 에너지 구슬 하나를 고른다. 고른 에너지 구슬의 번호를 x라고 한다. 단, 첫 번째와 마지막 에너지 구슬은 고를 수 없다.
- x번째 에너지 구슬을 제거한다.
- $W_{x-1}$ × $W_{x+1}$의 에너지를 모을 수 있다.
- N을 1 감소시키고, 에너지 구슬을 1번부터 N번까지로 다시 번호를 매긴다. 번호는 첫 구슬이 1번, 다음 구슬이 2번, ... 과 같이 매겨야 한다.
N과 에너지 구슬의 무게가 주어졌을 때, 모을 수 있는 에너지 양의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 에너지 구슬의 개수 N(3 ≤ N ≤ 10)이 주어진다.
둘째 줄에는 에너지 구슬의 무게 $W_1, W_2, ..., W_N$을 공백으로 구분해 주어진다. (1 ≤ $W_i$ ≤ 1,000)
출력
첫째 줄에 모을 수 있는 에너지의 최댓값을 출력한다.
코드
n = int(input()) weights = list(map(int, input().split())) ans = 0 def bt(w, total): global ans if len(w) < 3: ans = max(ans, total) return for i in range(1, len(w)-1): bt(w[:i]+w[i+1:], total+(w[i-1]*w[i+1])) bt(weights, 0) print(ans)
- bt()
- 입력으로 받은 w 배열에서 처음과 끝의 원소는 제외하고 인덱스 1인 원소부터 제거해보며 최대로 에너지를 모은다.
- w의 길이가 3 미만이라면 처음과 끝의 원소를 제외하면 뽑을 원소가 없으므로 이때까지 누적된 total을 ans와 비교하여 둘 중 큰 값을 ans에 저장하고 리턴한다.
N의 범위가 3 ≤ N ≤ 10으로 크지 않기 때문에 모든 경우의 수를 모두 시행해보도록 하였다.
'문제풀이 > 백트래킹' 카테고리의 다른 글
[Python/파이썬] 백준 20208번 진우의 민트초코우유 (0) | 2024.02.07 |
---|---|
[Python/파이썬] 백준 18429번 근손실 (0) | 2024.01.15 |
[Python/파이썬] 백준 17255번 N으로 만들기 (0) | 2024.01.01 |
[Python/파이썬] 백준 1189번 컴백홈 (0) | 2023.12.28 |
[Python/파이썬] 백준 6603번 로또 (0) | 2023.12.24 |