티스토리 뷰
#include <stdio.h>
#define min(a, b) ((a<b) ? a : b)
#define ll long long
int main(void)
{
long long int n;
ll int a[7] = {0}; //주사위 면의 숫자를 입력받음
scanf("%lld", &n);
ll int max_1 = 0; //가장 큰 눈
ll int min_1 = 0; //가장 작은 눈
ll int sum_1 = 0; //모든 눈들의 합
for(ll int i = 0; i<6; i++) { //눈 입력
scanf("%lld", &a[i]);
if(max_1 < a[i]) max_1 = a[i]; //가장 큰 눈 구하기
if(i == 0) min_1 = a[i]; //가장 작은 눈 구하기
if(i > 0 && min_1 > a[i]) min_1 = a[i];
sum_1 += a[i]; //모든 눈들의 합
}
if(n==1) { //주사위가 1개면, 모든 눈의 총합에 가장 큰 눈을 빼면 됨
printf("%lld", sum_1 - max_1);
return 0;
}
//변수들
ll int af = min(a[0], a[5]); //면A와 면F중 더 작은 것
ll int loop = 4; //반복을 위한 변수
ll int index[5] = {1, 2, 3, 4}; //index 배열
ll int jndex[5] = {2, 4, 1, 3}; //index 배열
int i = 0; //index 변수
ll int tmp_2 = af + a[index[i]] + a[jndex[i]]; //세 면의 눈들의 최소값 초기화
//세 면의 눈들의 최솟값 구하기
while(loop--) {
if(tmp_2 > af + a[index[i]] + a[jndex[i]]) {
tmp_2 = af + a[index[i]] + a[jndex[i]];
}
i++;
}
ll int tmp = 0; //임시 저장 변수
ll int min_2 = a[0]+a[index[1]]; ; //두 면의 눈들의 최솟값 초기화
//두 면의 최솟값 구하기
for(int m = 0; m<4; m++) { //면A을 포함
tmp = a[0] + a[index[m]];
if(min_2 > tmp) min_2 = tmp;
}
for(int m = 0; m<4; m++) { //면F을 포함
tmp = a[5] + a[index[m]];
if(min_2 > tmp) min_2 = tmp;
}
for(int m = 0; m<4; m++) { //면 A와 F을 포함하지 않음
tmp = a[jndex[m]] + a[index[m]];
if(min_2 > tmp) min_2 = tmp;
}
ll int tmp_sum = 0; //가장 작은 값을 담기 위한 변수 (정답)
tmp_sum += 4*tmp_2; //3면
tmp_sum += 4*(n-1)*min_2;//옆 부분 2면
if(n>2) tmp_sum += 4*(n-2)*min_2; //윗 부분 2면
if(n>2) tmp_sum += (n-2)*(n-2)*min_1; //윗 부분 1면
if(n>2) tmp_sum += 4*(n-1)*(n-2)*min_1; //옆 부분 1면
printf("%lld", tmp_sum); //최솟값 출력
return 0;
}
풀이
n = 1) 모든 눈의 합 - 가장 큰 눈의 합
n = 2) 세 면의 눈의 합의 최솟값 * 4 + 두 면의 눈의 합의 최솟값 * 2
n >= 3)
윗 부분 : 세 면의 눈의 합의 최솟값 * 4
+ 두 면의 눈의 합의 최솟값 * (n-2) * 4
+ 한 면의 눈의 최솟값 * (n-2) * (n-2)
옆 부분 : 두 면의 눈의 합의 최솟값 * (n-1) * 4
+ 한 면의 눈의 최솟값 * 4 * (n-1) * (n-2)
이다.
두 면, 세 면의 최솟값을 구할 땐 모든 경우의 수를 고려해서 구해야 한다.
예로서 세 면의 최솟값은
D 3
전개도 : E A B F --> 4 0 1 5
C 2
A면과 F면을 기준으로 잡은 후, 이들 중 더 작은 것만을 가지고, 나머지 (B-C), (C-E), (D-B), (D-E)쌍과 비교해 본다.
두 면의 최솟값도 모든 경우의 수을 비교해 본다.
https://www.acmicpc.net/problem/1041
1041번: 주사위
첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
| c언어 11047번 동전 (백준) (0) | 2022.06.10 |
|---|---|
| c언어 10844번 쉬운 계단 수 (백준) (0) | 2022.06.10 |
| c언어 2579번 계단 오르기 (백준) (0) | 2022.06.04 |
| c언어 10823번 더하기 2 (백준) (0) | 2022.06.04 |
| c언어 11024번 더하기 4 (백준) (0) | 2022.06.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- java
- 오프라인 쿼리
- 스택
- DP
- 누적 합
- Krustal
- union
- 브루트포스
- Segment Tree
- BFS
- 1835
- 기하학
- 1835번
- XOR
- 그리디
- 덱
- 백준
- find
- 누적합
- 문자열
- Lazy Propagation
- DFS
- C언어
- 그래프
- 정렬
- PASCAL
- 세그먼트 트리
- 최소 스패닝 트리
- 구현
- C++
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
