본문 바로가기

백준

백준1041 - 주사위

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

 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수는 50보다 작거나 같은 자연수이다.

www.acmicpc.net

정육면체의 길이가 N이 주어지고 보이는 면들의 최소합을 구하면 되는 문제이다. 

 

두 개의 면이 보이는 경우는 다음과 같다.

(A, B), (A, C), (A, E), (A, D), (B, C), (B, D), (B, F), (C, E), (C ,F), (D, E), (D, F), (E, F)

 

세 개의 면이 보이는 경우는 다음과 같다.

(A, B, C), (A, B, D), (A, E, C), (A, E, D), (B, F, C), (B, F, D), (C, F, E), (D, E, F)

 

주의할 점은 계산할 때 long long int로 맞춰주지 않으면 숫자 범위에 걸린다는 것이다.

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;

//long long int 자료형을 서로 비교하여 작은 값을 반환해주는 함수
long long int min(long long int a, long long int b) {
	if (a < b) {
		return a;
	}
	else {
		return b;
	}
}

int main() {
	map<char, long long int> mp; //A ~ F까지 숫자를 저장하기 위해 선언한 변수
	vector<long long int> v; //1*1*1일 때의 결과를 구하기 위해 선언한 변수 
	long long int sum = 0; //최소 합
	long long int plane[4]; //1면인 경우 최소합, 2면인 경우 최소합, 3면인 경우 최소합
	long long int N; //주어진 정육면체의 한 변 길이

	cin >> N;
	for (int i = 0; i < 6; i++) {
		int num;
		cin >> num;
		v.push_back(num);
		mp['A' + i] = num;
	}

	for (int i = 1; i <= 3; i++) {
		plane[i] = 987654321;
	}

	//1면 최소 구하기
	plane[1] = min(plane[1], mp['A']);
	plane[1] = min(plane[1], mp['B']);
	plane[1] = min(plane[1], mp['C']);
	plane[1] = min(plane[1], mp['D']);
	plane[1] = min(plane[1], mp['E']);
	plane[1] = min(plane[1], mp['F']);

	//2면 최소 구하기
	plane[2] = min(plane[2], mp['A'] + mp['B']);
	plane[2] = min(plane[2], mp['A'] + mp['C']);
	plane[2] = min(plane[2], mp['A'] + mp['E']);
	plane[2] = min(plane[2], mp['A'] + mp['D']);
	plane[2] = min(plane[2], mp['B'] + mp['C']);
	plane[2] = min(plane[2], mp['B'] + mp['D']);
	plane[2] = min(plane[2], mp['B'] + mp['F']);
	plane[2] = min(plane[2], mp['C'] + mp['E']);
	plane[2] = min(plane[2], mp['C'] + mp['F']);
	plane[2] = min(plane[2], mp['D'] + mp['E']);
	plane[2] = min(plane[2], mp['D'] + mp['F']);
	plane[2] = min(plane[2], mp['E'] + mp['F']);

	//3면 최소 구하기
	plane[3] = min(plane[3], mp['A'] + mp['B'] + mp['C']);
	plane[3] = min(plane[3], mp['A'] + mp['B'] + mp['D']);
	plane[3] = min(plane[3], mp['A'] + mp['E'] + mp['C']);
	plane[3] = min(plane[3], mp['A'] + mp['E'] + mp['D']);
	plane[3] = min(plane[3], mp['B'] + mp['F'] + mp['C']);
	plane[3] = min(plane[3], mp['B'] + mp['F'] + mp['D']);
	plane[3] = min(plane[3], mp['C'] + mp['F'] + mp['E']);
	plane[3] = min(plane[3], mp['D'] + mp['E'] + mp['F']);

	if (N == 1) {
		sort(v.begin(), v.end()); //면의 숫자를 오름차순으로 정렬
		for (int i = 0; i < 5; i++) { //5개의 면을 더한다
			sum = sum + v[i];
		}
	}
	else {
		sum = plane[3] * 4LL + plane[2] * ((N - 2LL) * 4LL + (N - 1LL) * 4LL) + plane[1] * ((N - 1LL) * (N - 2LL) * 4LL + (N - 2LL) * (N - 2LL)); //long long int 자료형을 맞추기 위하여 LL로 통일
	}

	cout << sum;
}

'백준' 카테고리의 다른 글

백준2491 - 수열  (0) 2020.03.29
백준1890 - 점프  (0) 2020.03.27
백준14889 - 스타트와 링크  (0) 2020.03.22
백준2573 - 빙산  (0) 2020.03.22
백준2075 - N번째 큰 수  (0) 2020.03.21