일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 자바
- 나누어 떨어지는 숫자 배열 python
- 코드업 1020 java
- 프로그래머스 가운데 글자 가져오기 파이썬
- 가운데 글자 가져오기 java
- 핸즈온 머신러닝
- 코드업 1020 자바
- 청년 Ai Big Data 아카데미
- m1 docker install
- 최단 경로 알고리즘
- docker remove
- m1 docker
- 트리의 지름 java
- 빅분기실기
- 청년 AI Big Data 아카데미 13기
- 빅데이터분석기사
- 프로그래머스 가운데 글자 가져오기 자바
- 가운데 글자 가져오기 python
- docker 삭제
- 트리의 지름 자바
- docker 완전 삭제
- codeup 1020 java
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- 최소 스패닝 트리 자바
- 나누어 떨어지는 숫자 배열 java
- 최소 스패닝 트리
- codeup 1020 자바
- 프로그래머스 가운데 글자 가져오기 python
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- Today
- Total
NineTwo meet you
[백준/자바] 16198 에너지 모으기 본문
문제
N개의 에너지 구슬이 일렬로 놓여져 있고, 에너지 구슬을 이용해서 에너지를 모으려고 한다.
i번째 에너지 구슬의 무게는 Wi이고, 에너지를 모으는 방법은 다음과 같으며, 반복해서 사용할 수 있다.
- 에너지 구슬 하나를 고른다. 고른 에너지 구슬의 번호를 x라고 한다. 단, 첫 번째와 마지막 에너지 구슬은 고를 수 없다.
- x번째 에너지 구슬을 제거한다.
- Wx-1 × Wx+1의 에너지를 모을 수 있다.
- 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]--;
}
}
}
코드
'프로그래밍 문제 > 백준' 카테고리의 다른 글
[백준/자바] 2252 줄 세우기 (0) | 2021.01.07 |
---|---|
[백준/자바] 16197 두 동전 (0) | 2020.12.30 |
[백준/자바] 14225 부분수열의 합 (0) | 2020.12.30 |
[백준/자바] 15661 링크와 스타트 (0) | 2020.12.30 |
[백준/자바] 11816 8진수, 10진수, 16진수 (0) | 2020.12.28 |