https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
어떻게 풀까 매우 고민했었다. 정육면체의 한면의 최솟값을 구하고 x6을 할까 생각을 했었다.
하지만 정육면체중 한면, 두면, 세면만 보이는 작은 정육면체의 갯수를 구하고 그 합들을 더하기로 했다.
먼저 한면만 보이는 정육면체이다.

먼저 내가 생각한 로직은 맨 위 한줄과 그 밑의 정육면체의 갯수를 구하고 그 한줄을 뺀 나머지 밑에 있는 정육면체의 갯수를 구한뒤 더하자고 생각했다
그래서 맨위 한줄의 정육면체중 한면만 보이는 사각형의 갯수는 (n-2) * (n-2)이라는 공식을 알게됐다.
그리고 그 밑줄에만 있는 사각형들은 한면에 총 (n-2) * (n-1)개이다. 하지만 총 4면이 있으니 x4를 하게 됐다.
두면이 보이는 정육면체의 갯수를 구한다.

한면만 보이는 정육면체의 로직과 같이 맨위에 한줄, 그 밑에있는 정육면체들의 갯수를 구하기로 했다.
맨 위에 있는 정육면체들은 각 꼭지점에 있는 정육면체를 제외하고는 모두 두면이 보이는 정육면체이므로 한줄에
(n-2)개가 있다. 총 4줄이 있으니 4*(n-2)개를 한뒤
그 밑에 있는 정육면체들은 그림에도 알 수 있듯이 맨위에 있는 정육면체를 제외하고 (n-1)*4개 이다.
이것합쳐서 총 4*(n-2) + (n-1)*4 개이다.

마지막으로 세면이 보이는 정육면체이다.
n이 어느수든 무조건 4개밖에 없으므로 크기는 4로 고정했다.
이렇게 1,2,3면이 보이는 갯수를 구해 다 더하기로 했다.
밑에는 정답코드이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long n = Integer.parseInt(br.readLine());
long scene[] = new long[3];
scene[0] = (n-2)*(n-2) + ( 4*(n-2)*(n-1) ) ; // 한면만 보이는 갯수
scene[1] = ( 4*(n-2) ) + ( 4*(n-1) ); // 두면만 보이는 갯수
scene[2] = 4; // 세면만 보이는 갯수
int arr[] = new int[6];
long num = 0;
long sum = 0;
long min;
String s[] = br.readLine().split(" ");
for (int i = 0; i < 6; i++) {
arr[i] = Integer.parseInt(s[i]);
} // for
if (n==1) {
Arrays.sort(arr);
min = arr[0];
for (int i = 0; i < arr.length-1; i++) {
sum += arr[i];
} //for
} else {
min = arr[0];
//한면만 보이는 총 합
for (int i = 0; i < arr.length; i++) {
min = Math.min(min, arr[i]);
} //for
sum += min*scene[0]; //한면만 보이는 총 합
// 두면이 보이는 총합
min = Long.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if (i+j != 5) {
min = Math.min(min, arr[i]+arr[j]);
} //if
} // for
} // for
sum+= min*scene[1]; // 두면이 보이는 총합
for (int i = 0; i < 3; i++) {
num += Math.min(arr[i], arr[5-i]);
} // for
sum+= num*scene[2];
}// if else
System.out.println(sum);
} // main
} // class
'BOJ, Programmers' 카테고리의 다른 글
[Java] 프로그래머스 (이중우선 순위 큐 ) (0) | 2024.04.05 |
---|---|
[Java] 백준 2822 (점수 계산) (0) | 2024.04.05 |
[Java] 백준 1500 (최대곱) (0) | 2024.04.03 |
[Java] 백준 1010번 (다리놓기) (0) | 2024.03.30 |
[Java] 백준 1012번 (유기농 배추) (0) | 2024.03.30 |