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

1. 문제설명
주사위는 N^3개가 있고 해당 주사위를 쌓아 정육면체를 만드는 경우 밖으로 노출되는 면은 바닥을 제외하고 5개기에 노출되는 면의 합을 구하면 되는 문제이다.
2.풀이
처음에 접근할 때 노출되는 주사위면이 어떤 식으로 구성되나 먼저 생각을 해보았습니다.
3면이 노출되는 경우, 2면이 노출되는 경우, 1면이 노출되는 경우 3가지를 생각했고 N의 크기와 상관 관계를 생각해 보았습니다.
N = 1 인 경우는 5개의 면이 노출되어야 하니 이 경우는 예외로 처리해야 된다 생각했습니다
N = 2 인 경우는 3면이 노출되는 경우 4개, 2면이 노출되는 경우 4개로 이루어져 있었습니다.
N = 3 인 경우 3면이 노출되는 경우 4개, 2면이 노출되는 경우 12개 1면이 노출되는 경우 9개로 이루어져 있었습니다.
이를 정리해보니
3면이 노출되는 경우는 4개 고정
2면이 노출되는 경우는 상단에 4(모서리)*(N-2) 사이드에 4(모서리)*(N-1)로 처리가 가능하고
1면이 노출되는 경우는 상단 중앙에(N-2)*(N-2) 사이드 중앙에(N-2)(N-1)*4(면)으로 처리가 가능했습니다.
이를 식으로 표현하면 12 + 16n - 24 + 5n^2 - 16n + 12와 같은 결과가 나옵니다.
이제 3면의 최소값, 2면의 최소값 1면의 최소값을 구해야하는데, 1면의 최소값 같은 경우는 6면중의 최소값을 선정하면 됩니다.
2면의 최소값 같은 경우는 조건이 생깁니다. 마주보는 면은 처리를 하면 안되기에 두 면의 번호의 합이 5가 되면 안되는 조건이 발생합니다.
3면의 같은 경우도 동일하게 두면의 번호의 합이 5가 되면 안되는데 면의 3개이므로 or문을 사용하여 두 경우중 하나에 해당되면 바로 예외처리를 해줘야합니다.
3.소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static long N, face_1,face_2,face_3,max=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int[] arr = new int[7];
int sum = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<6; i++){
arr[i] = Integer.parseInt(st.nextToken());
max = Math.max(arr[i],max);
sum += arr[i];
}
if(N == 1){
System.out.println(sum - max);
return;
}
long AF = Math.min(arr[0],arr[5]);
long BE = Math.min(arr[1],arr[4]);
long CD = Math.min(arr[2],arr[3]);
face_3 = AF+BE+CD;
face_2 = Math.min(AF+BE,Math.min(BE+CD, AF+CD));
face_1 = Math.min(AF,Math.min(BE,CD));
System.out.println(calc());
}
public static long calc(){
long face_one = 4*(N-1)*(N-2) + (N-2)*(N-2);
long face_two = 4*(N-2) + 4*(N-1);
long face_three = 4;
long sum = 0;
sum = face_one*face_1 + face_two*face_2 + face_three*face_3;
return sum;
}
}

5. 피드백
처음에 face를 처리하는 경우 int를 써서 처리했는데 이 경우에 자료형의 크기를 벗어나 오류를 발생시키는 경우가 생겼습니다.
머리속으로는 long을 써서 처리해야지 했지만 디테일하게 신경을 못써서 생긴 결과라 생각합니다.
'알고리즘 > 그리디 알고리즘' 카테고리의 다른 글
| [백준 1783번] 병든 나이트 [JAVA] (0) | 2024.06.11 |
|---|---|
| [백준 31926번] 밤양갱 [JAVA] (0) | 2024.06.02 |