728x90
https://www.acmicpc.net/problem/1041
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
List<Integer> list = new ArrayList<>();
for (int i=0; i<6; i++)
list.add(Integer.parseInt(st.nextToken()));
if (N == 1) {
Integer min = Collections.max(list);
Long sum = 0L;
for (Integer i: list)
sum += i;
System.out.println(sum - min.intValue());
return;
}
List<Integer> sides3 = new ArrayList<>();
sides3.add(list.get(0) + list.get(1) + list.get(2));//012
sides3.add(list.get(0) + list.get(1) + list.get(3));//013
sides3.add(list.get(0) + list.get(2) + list.get(4));//024
sides3.add(list.get(0) + list.get(3) + list.get(4));//034
sides3.add(list.get(1) + list.get(2) + list.get(5));//125
sides3.add(list.get(1) + list.get(3) + list.get(5));//135
sides3.add(list.get(2) + list.get(4) + list.get(5));//245
sides3.add(list.get(3) + list.get(4) + list.get(5));//345
long minSide3 = Collections.min(sides3);
List<Integer> sides2 = new ArrayList<>();
sides2.add(list.get(0) + list.get(1));//01
sides2.add(list.get(0) + list.get(2));//02
sides2.add(list.get(0) + list.get(3));//03
sides2.add(list.get(0) + list.get(4));//04
sides2.add(list.get(1) + list.get(2));//12
sides2.add(list.get(1) + list.get(3));//13
sides2.add(list.get(1) + list.get(5));//15
sides2.add(list.get(2) + list.get(4));//24
sides2.add(list.get(2) + list.get(5));//25
sides2.add(list.get(3) + list.get(4));//34
sides2.add(list.get(3) + list.get(5));//35
sides2.add(list.get(4) + list.get(5));//45
long minSide2 = Collections.min(sides2);
long min = Collections.min(list);
long result = 0;
//안쪽꺼 더하기
result += min*(N-2)*(N-1)*4 + min*(N-2)*(N-2); //옆면4 + 윗면1
//밑에 2면만 보이는 4개
result += minSide2 * 4;
//위에 3면만 보이는 4개
result += minSide3 * 4;
//옆에 쩌리 2면보이는 거 8개
result += (N-2)*8*minSide2;
System.out.println(result);
}
}
- 노가다로 풀었다
- N이 1인 경우와 아닌 경우를 나눠서 풀었다
- N이 1인 경우에는 면 중 max값을 제외한 나머지 5면을 더하면 되고
- N이 1이 아닌 경우에는 나눠서 계산한다. 나눈 방식은 아래 그림에서 설명
<안쪽꺼>
- 4개의 옆면 경우 (N-1) * (N-2)
- 1개의 윗면 경우 (N-2) * (N-2)
<밑에 2면만 보이는거 4개>
- 2면만 보이는 거 4블록 있음
- 겹치는 2면의 합이 가장 작은 걸 찾아서 4를 곱하기
<위에 3면만 보이는거 4개>
- 3면만 보이는 4거 4블록 있음
- 겹치는 3면의 합이 가장 작은 걸 찾아서 4를 곱하면 됨
<옆에 쩌리 2면 보이는거 8개>
- 옆에 남은 친구들 8블록이다
- 2면만 보인다
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 백준 1339 단어 수학 - 골드4 (0) | 2023.07.14 |
---|---|
[Java] 백준 1083 소트 - 골드5 (1) | 2023.07.13 |
[Java] 백준 9009 피보나치 - 실버1 (0) | 2023.07.13 |
[Java] 백준 1946 신입 사원 - 실버1 (0) | 2023.07.13 |
[Java] 백준 1931 회의실 배정 - 실버1 (0) | 2023.07.13 |