코딩테스트
[백준] 1041번 '주사위' - Java
CuckooBird
2023. 8. 10. 15:46
https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(bf.readLine());
StringTokenizer st = new StringTokenizer(bf.readLine());
int[] dice = new int[6];
int max = 0;
long sum = 0;
for(int i = 0 ; i < 6 ; i++) {
dice[i] = Integer.parseInt(st.nextToken());
max = Math.max(max, dice[i]);
sum += dice[i];
}
int side1 = INF, side2 = INF, side3 = INF;
if(n == 1) {
bw.write(sum - max + "\n");
bf.close();
bw.flush();
bw.close();
return;
}
for(int i = 0 ; i < 6 ; i++) {
side1 = Math.min(side1, dice[i]);
for(int j = i + 1 ; j < 6 ; j++) {
if(i + j != 5) {
side2 = Math.min(side2, dice[i] + dice[j]);
for(int k = j + 1 ; k < 6 ; k++) {
if(i + k != 5 && j + k != 5) {
side3 = Math.min(side3, dice[i] + dice[j] + dice[k]);
}
}
}
}
}
sum = 0;
sum += side3 * 4;
sum += side2 * ((long) 8 * n - 12);
sum += side1 * ((long) 5 * n * n - 16 * n + 12);
bw.write(sum + "\n");
bf.close();
bw.flush();
bw.close();
}
}
2면과 3면이 되는 경우보다는 안 되는 경우만 찾으면 끝났다고 보면 됩니다.
안 되는 경우는 정반대편의 둘이 되겠죠?
A와 F , B와 E , D와 C는 3면과 2면에 같이 존재할 수없습니다.
그리고 더한 값이 모두 5로 같으므로 i+j , i+k, j+k가 5가 되지 않는 경우에 최소값을 따지면 됩니다.
마지막으로 1일 경우만 처리해주면 됩니다.