코딩테스트

[백준] 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일 경우만 처리해주면 됩니다.