본문 바로가기
코딩/백준-자바

[자바] 백준 1041번: 주사위

by 철없는민물장어 2023. 1. 2.
728x90

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

 

1041번: 주사위

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

www.acmicpc.net

 


주사위를 모아놓으면..

어떤 주사위는 세 면이 보일것이고, 어떤 주사위는 두 면만, 어떤 주사위는 한 면만 보일것이다.

.

.

주사위가 N^3개일 때 세 면, 두 면, 한 면이 보이는 주사위가 몇개일지 계산했다.

 

그리고 나서

세 면이 보일 때 최솟값, 두 면이 보일 때 최솟값을 구하는데..

여러가지 조합이 너무 많았다...

어쩔 수 있나?..보이는 조합을 다 적는 노가다를 했다.

 

 

ABCDEF를 숫자인덱스로 매칭해서 반복문을 돌려 

조합 중 최솟값을 찾았다.


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

public class P1041 {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		long n = Long.parseLong(br.readLine());
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		long[] side= new long[4];
		side[1] = ((n-2)*(n-1)*4+(n-2)*(n-2));
		side[2] = ((n-2)*4+(n-1)*4);
		side[3] = 4;
		
		int[] cube= new int[6];
		for(int i=0;i<6;i++) {
			cube[i]=Integer.parseInt(st.nextToken());
		}
		
		if(n<=1) {
			System.out.println(Arrays.stream(cube).sum()-Arrays.stream(cube).max().orElse(0));
			
		}
		else {
			long threeSide = side[3] * min_3(cube);
			long twoSide = side[2]*min_2(cube);
					
			long single = side[1]*(long)Arrays.stream(cube).min().orElse(0);
			long result= threeSide + twoSide + single;
			System.out.println(result);
		}
	}
	static long min_2(int[] cube){
		int[][] comb = {{0,2},{0,1},{0,4},{0,3},{4,2},{2,1},{1,3},{3,4},{2,5},{1,5},{3,5},{4,5}};
		long min=Long.MAX_VALUE;
		for(int i=0;i<comb.length;i++) {
			if(min>cube[comb[i][0]]+cube[comb[i][1]])
				min=cube[comb[i][0]]+cube[comb[i][1]];
		}
		return min;
		
	}
	static long min_3(int[] cube){
		int[][] comb = {{0,1,2},{0,1,3},{0,3,4},{0,4,2},{2,4,5},{1,2,5},{1,3,5},{3,4,5}};
		long min=Long.MAX_VALUE;
		for(int i=0;i<comb.length;i++) {
			if(min>cube[comb[i][0]]+cube[comb[i][1]]+cube[comb[i][2]])
				min=cube[comb[i][0]]+cube[comb[i][1]]+cube[comb[i][2]];
		}
		return min;
		
	}

}

큰 수를 넣었더니 값이 이상하게 나오길래 

result를 long타입으로 바꿨다.

근데.. long타입인데도 값이 자꾸 이상한것이다!!

그래서 이 숫자가 long범위를 넘어서나? 라고 생각하고서 BigInteger를 도입. 

구글링을 하면서 BigInteger사용법을 이리저리 찾던 찰나.....

암만 숫자가 커도 2^64를 넘어갈까? 내가 잘못적은게 있는거 아닐까?..

하고 30분가량을 헤맸다.

.

.

알고보니 n 입력받을 때 int형으로 받아서 이상했던 것이다.

n을 long형으로 바꿔주니 정상작동했다.

.

.

 

제출했더니 89퍼에서 실패했다

도대체 왜... 다 잘돼놓고 89에서 멈출까...

내가 계산은 제대로했던것 같은데...

생각하면서 다시 코드를 봤더니

n==1일 때 arrays.sum에서 arrays.max를 빼줘야 하는데 min이라고 적어놓음

 

이거 고치니까 성공했다.

ㅠㅠ

728x90

댓글