728x90
https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
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 |