코딩테스트/그리디(Greedy)

[Java] 백준 1041번 : 주사위

sujin7837 2022. 6. 4. 16:44
반응형

문제

    +---+        
    | D |        
+---+---+---+---+
| E | A | B | F |
+---+---+---+---+
    | C |        
    +---+        

주사위는 위와 같이 생겼다. 주사위의 여섯 면에는 수가 쓰여 있다. 위의 전개도를 수가 밖으로 나오게 접는다.

A, B, C, D, E, F에 쓰여 있는 수가 주어진다.

지민이는 현재 동일한 주사위를 N3개 가지고 있다. 이 주사위를 적절히 회전시키고 쌓아서, N×N×N크기의 정육면체를 만들려고 한다. 이 정육면체는 탁자위에 있으므로, 5개의 면만 보인다.

N과 주사위에 쓰여 있는 수가 주어질 때, 보이는 5개의 면에 쓰여 있는 수의 합의 최솟값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수는 50보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1

2
1 2 3 4 5 6

예제 출력 1

36

예제 입력 2

3
1 2 3 4 5 6

예제 출력 2 

69

예제 입력 3

1000000
50 50 50 50 50 50

예제 출력 3

250000000000000

예제 입력 4

10
1 1 1 1 50 1

예제 출력 4 

500

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	private static BufferedReader br;
	private static StringTokenizer st;
	
	private static long N, result;
	private static long []dice=new long[6];
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		br=new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(br.readLine());
		
		st=new StringTokenizer(br.readLine());
		for(int i=0;i<6;i++) {
			dice[i]=Long.parseLong(st.nextToken());
		}
		
		result=0;
		if(N==1) {	// 크기가 1일 때
			Arrays.sort(dice);
			for(int i=0;i<5;i++) result+=dice[i];
		} else {	// 크기가 1보다 클 때
			// 한 면
			long val=Long.MAX_VALUE;
			for(long x:dice) {
				if(x<val) val=x;
			}
			long one=(N-2)*(5*N-6)*val;
			
			// 두 면
			val=Long.MAX_VALUE;
			val=Math.min(Math.min(dice[0]+dice[1], dice[1]+dice[5]), Math.min(dice[0]+dice[4], dice[4]+dice[5]));
			long tmp=Math.min(dice[2], dice[3]);
			val=Math.min(Math.min(dice[0]+tmp, dice[1]+tmp), val);
			val=Math.min(Math.min(dice[4]+tmp, dice[5]+tmp), val);
			long two=(8*N-12)*val;
			
			// 세 면
			val=Long.MAX_VALUE;
			val=Math.min(Math.min(dice[0]+dice[1], dice[1]+dice[5]), Math.min(dice[0]+dice[4], dice[4]+dice[5]));
			val+=tmp;
			long three=4*val;
			
			result=one+two+three;
		}
		
		System.out.println(result);
	}
}

1. N==1

가장 큰 수 1개를 제외한 나머지 면의 수를 모두 더합니다.

 

2. N > 1

    2-1. 한 면만 보이는 경우 : (N-2) * (N-2)(N-1)*4 = (N-2)(5N-6) 개

    2-2. 두 면이 보이는 경우 : 8N - 12 개

    2-3. 세 면이 보이는 경우 : 4개

 

    3가지 경우 각각에 대해 인접한 수가 1개, 2개, 3개인 경우 최솟값을 구하여 개수만큼 곱해줍니다.

 

3. 위 3가지 경우의 결과를 모두 더합니다.

 

반응형