[BaekJoon] 1041 주사위 (Java)

SeongWon Oh·2022년 2월 11일
0
post-thumbnail

🔗 문제 링크

https://www.acmicpc.net/problem/1041


📝 문제풀이 방법

문제는 주사위로 N * N * N 크기의 정육면체를 만들었을 때 표면에 있는 주사위 수의 값이 최소가 되는 값을 찾는 문제이다.
주사위가 1 * 1 * 1크기를 제외하고는 모든 주사위들은 각각 1~3개의 면을 외부에 보이게 됩니다.
그래서 1~3개의 표면이 보일 때의 최소 값들을 각각 구한 후 큰 정육면체의 외부 표면 수의 합을 구하여 문제를 풀었습니다.

주사위가 2~3개의 표면이 외부에 보이는 경우는 아래의 사진과 같으며 아래 표시된 부분과 바닥을 제외한 위치들이 1개의 표면이 보이는 경우가 됩니다.

그리하여 각각의 외부에 보이는 주사위의 개수는 다음과 같습니다.

long numOfOneSpace = ((N - 2) * (N - 2) * 5) + ((N - 2) * 4);
long numOfTwoSpace = ((N - 2) * 8) + 4;
long numOfThreeSpace = 4L;

👨🏻‍💻 내가 작성한 코드

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        long N = Integer.parseInt(bufferedReader.readLine());

        String dice = bufferedReader.readLine();
        StringTokenizer stringTokenizer = new StringTokenizer(dice);

        int[] diceNumber = new int[6];
        for (int i = 0; i < diceNumber.length; i++) {
            diceNumber[i] = Integer.parseInt(stringTokenizer.nextToken());
        }

        if (N == 1) {
            int max = Integer.MIN_VALUE;
            long result = 0;
            for (int i = 0; i < 6; i++) {
                max = Math.max(max, diceNumber[i]);
                result += diceNumber[i];
            }
            System.out.println(result - max);
            return;
        }

        int minOneSpace = Arrays.stream(diceNumber).min().getAsInt();
        int minSumOfTwoSpace = getMinSumOfTwoSpace(diceNumber);
        int minSumOfThreeSpace = getMinSumOfThreeSpace(diceNumber);

        System.out.println(getResult(N, minOneSpace, minSumOfTwoSpace, minSumOfThreeSpace));
    }

    private static int getMinSumOfTwoSpace(final int[] diceNumber) {
        int minNum = Integer.MAX_VALUE;
        for (int i = 0; i < 6; i++) {
            for (int j = i + 1; j < 6; j++) {
                if ((i + j) == 5) {
                    continue;
                }
                if ((diceNumber[i] + diceNumber[j]) < minNum) {
                    minNum = diceNumber[i] + diceNumber[j];
                }
            }
        }
        return minNum;
    }

    private static int getMinSumOfThreeSpace(final int[] diceNumber) {
        int minNum = Integer.MAX_VALUE;
        for (int i = 0; i < 6; i++) {
            for (int j = i + 1; j < 6; j++) {
                for (int k = j + 1; k < 6; k++) {
                    if ((i + j) == 5 || (i + k) == 5 || (j + k) == 5) {
                        continue;
                    }
                    if ((diceNumber[i] + diceNumber[j] + diceNumber[k]) < minNum) {
                        minNum = diceNumber[i] + diceNumber[j] + diceNumber[k];
                    }
                }
            }
        }
        return minNum;
    }

    private static long getResult(final long N, final int oneSpace, final int twoSpace, final int threeSpace) {
        long numOfOneSpace = ((N - 2) * (N - 2) * 5) + ((N - 2) * 4);
        long numOfTwoSpace = ((N - 2) * 8) + 4;
        long numOfThreeSpace = 4L;

        long totalOneSpace = numOfOneSpace * oneSpace;
        long totalTwoSpace = numOfTwoSpace * twoSpace;
        long totalThreeSpace = numOfThreeSpace * threeSpace;

        return totalOneSpace + totalTwoSpace + totalThreeSpace;
    }
}

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글