https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
문제
풀이
첫번째. 1면, 2면, 3면 인 경우의 최소합을 각각 구하기
두번째. N개 일때 1,2,3 면이 각각 몇개 나오는지 구하기
1. 3면이 나와야 하는 경우 - 맨 윗면 꼭지점 부분 4군데 : 4
2. 2면이 나와야 하는 경우 - 전체 모서리 수에서 육면체 꼭지점 부분을 뺀 값 + 맨 아래 꼭지점부분 4 : 8(N-2)+4
3. 1면이 나와야 하는 경우 - 각 면마다 가운데 있는부분 5개 + 맨 아래 각 모서리 부분 4개 : 5(N-2)^2 + 4(N-2)
이제 1~3면의 최소 값을 구해야 한다.
육면체에서 인접하지 않고 마주보는 면의 쌍은 총 3쌍이다. (a,f) (b,e) (c,d)
3쌍 중 각각 작은 구한다. ( a,f 중 작은 값 , b,e 중 작은 값, c,d중 작은값 )
그리고 구한 값을 차례대로 정렬한다. ( 3개의 쌍 중에 각각 뽑은 면은 항상 인접함 )
정렬 순으로 맨 앞에있는것이 : 1면의 최소 값
1면의 최소값 + 정렬 했을때 2번째 값이 : 2면의 최소 값
2면의 최소값 + 정렬 했을때 3번째 값이 : 3면의 최소 값
그리고 아까 구한 1,2,3 을 각 면의 최소 값을 곱해주고 더하면 끝. (N==1일때 예외처리 할 것)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N = Long.parseLong(br.readLine());
long answer = 0;
int[] section = Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray();
long[] minSection = new long[3];
Arrays.fill(minSection,Integer.MAX_VALUE);
minSection[0] = Math.min(section[0],section[5]);
minSection[1] = Math.min(section[1],section[4]);
minSection[2] = Math.min(section[2],section[3]);
Arrays.sort(minSection);
minSection[1] +=minSection[0];
minSection[2] +=minSection[1];
answer = N==1 ? Arrays.stream(section).sum()-Arrays.stream(section).max().getAsInt() :
4*minSection[2]+((N-2)*8+4)*minSection[1]+((N-2)*(N-2)*5+4*(N-2))*minSection[0];
System.out.println(answer);
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [1715] 카드 정렬하기JAVA (0) | 2021.10.26 |
---|---|
[BOJ] 백준 [1339] 단어 수학JAVA (0) | 2021.10.25 |
[BOJ] 백준 [16236] 아기 상어 JAVA (0) | 2021.10.22 |
[BOJ] 백준 [10971] 외판원 순회2 JAVA (0) | 2021.10.21 |
[BOJ] 백준 [2146] 다리만들기 JAVA (0) | 2021.10.14 |