728x90
https://www.acmicpc.net/problem/1041
주사위를 모아놓으면..
어떤 주사위는 세 면이 보일것이고, 어떤 주사위는 두 면만, 어떤 주사위는 한 면만 보일것이다.
.
.
주사위가 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
'코딩 > 백준-자바' 카테고리의 다른 글
[자바] 백준 1197번: 최소 스패닝 트리 (0) | 2023.01.02 |
---|---|
[자바] 백준 2864번: 5와 6의 차이 (0) | 2023.01.02 |
[자바] 백준 10610번: 30 (0) | 2023.01.02 |
[자바] 백준 1449번: 수리공 항승 (0) | 2023.01.02 |
[자바] 백준 2812번: 크게 만들기 (0) | 2023.01.01 |
댓글