알고리즘

[C++] G5 백준 1041 - 주사위

셓셓 2026. 1. 28. 15:46

 

1. 문제 링크

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

소요 시간 : 1시간?

시도 횟수 : 3

 

2. 문제 설명

난이도 : G5

사용 알고리즘 : 구현

주사위 N * N * N개를 쌓고 바깥에 보이는 수의 합의 최솟값은 무엇일까?

 

3. 풀이 방식 및 해결

처음 생각은 이랬다

"그냥 가장 작은것만 보인다고 가정하면 되는거 아닌가?"

이 생각으로 제일 작은 세 수가 노출되는 수를 계산했다.

(4개 면이 보이는 경우는 없으니까!)

 

근데 틀렸다. 혹시나 싶어 개수를 잘못 셌나 싶어 다르게 세봤는데 또 틀렸다.

난 뭘 잘못했나 하고 고민하고 반례를 찾다가

알아버렸다,,

주사위 반대편은 보일 수 없다는 사실,,,!

이를 깨닫고 둘 중 작은 면만을 사용해서 계산하니 또 틀렸당

 

원인은 N==1인 경우! ← 생각 했었는데 까먹고 있다가 다시 떠올렸다

 

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;	

int main() {
	long long n;
	long long ans = 0;
	vector<long> v_tmp;
	cin >> n;
	for (int i = 0; i < 6; i++) {
		long long t;
		cin >> t;
		v_tmp.push_back(t);
	}
    if(n==1) {
        sort(v_tmp.begin(), v_tmp.end());
        cout << v_tmp[0]+v_tmp[1]+v_tmp[2]+v_tmp[3]+v_tmp[4];
        return 0;
    }

    vector<long> v;
    v.push_back(min(v_tmp[0], v_tmp[5]));
    v.push_back(min(v_tmp[1], v_tmp[4]));
    v.push_back(min(v_tmp[2], v_tmp[3]));
	sort(v.begin(), v.end());
    
	ans += (v[0] + v[1]) * 4 * (n - 1);
	ans += v[0] * (n - 2) * 4 * (n - 1);
	ans += (v[0] + v[1] + v[2]) * 4;
	ans += (v[0] + v[1]) * (n - 2) * 4;
	ans += v[0] * (n - 2) * (n - 2);
	cout << ans;
}

 

<오늘의 TMI>
또 어느 순간 블로그 작성을 미루다가 갑자기 생각난 김에 하나 적어봤다.
생각은 항상 하는 편임.
이젠 3일마다 작심삼일 할래
한국사 공부하고 있는데 내용이 꽤나 많아서 당황