관리 메뉴

NineTwo meet you

[백준/자바] 16198 에너지 모으기 본문

프로그래밍 문제/백준

[백준/자바] 16198 에너지 모으기

NineTwo 2020. 12. 30. 20:09
반응형

문제 링크


문제

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

설명

3 이상 10 이하인 N의 범위와 "첫 번째와 마지막 에너지 구슬은 고를 수 없다."는 조건을 통해

탐색해야 할 수는 1 이상 8 이하인 것을 알 수 있다.

따라서 순열을 사용해 모든 경우의 수를 살펴볼 수 있다.

 

N = 5일 때,

5 6 1 4 3 이 주어진다면 첫 번째와 마지막 에너지 구슬을 제외한 6 1 4는 다음과 같이 탐색을 진행할 수 있다.

6 -> 1 -> 4

6 -> 4 -> 1

1 -> 6 -> 4

1 -> 4 -> 6

4 -> 1 -> 6

4 -> 6 -> 1

 

하지만 "x번째 에너지 구슬을 제거한다."는 조건 때문에 인덱스로 순열을 구성한다면 한 턴이 끝날 때마다 인덱스 값을 수정해야 한다.

 

위의 예시에서 6 -> 1 -> 4의 순서의 인덱스의 변화는 다음과 같다.

  초기 인덱스 6을 지운 후 인덱스 1을 지운 후 인덱스 4를 지운 후 인덱스
5 0 0 0 0
6 1      
1 2 1    
4 3 2 1  
3 4 3 2 1

 

위의 예시에서 1 -> 6 -> 4의 순서의 인덱스 변화는 다음과 같다.

  초기 인덱스 1을 지운 후 인덱스 6을 지운 후 인덱스 4를 지운 후 인덱스
5 0 0 0 0
6 1 1    
1 2      
4 3 2 1  
3 4 3 2 1

 

인덱스 변화를 살펴보면 인덱스를 지울 때 해당 인덱스보다 작은 인덱스에는 영향을 안 미치지만

해당 인덱스보다 크기가 큰 인덱스는 1씩 감소한 것을 확인할 수 있고 이를 구현해 실수를 막아야 한다.

안쪽 for문을 사용해 해당 인덱스보다 크기가 큰 인덱스를 1씩 감소시키는 것을 확인할 수 있다.

for(int i = 0; i < output.length; i++) {
			result += temp.get(output[i]-1)*temp.get(output[i]+1);
			temp.remove(output[i]);
			for(int j = i+1; j < output.length; j++) { // 인덱스 감소 시킴
				if(output[i] < output[j]) {
					output[j]--;
				}
			}
}

코드

반응형
Comments