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일마다 작심삼일 할래
한국사 공부하고 있는데 내용이 꽤나 많아서 당황
'알고리즘' 카테고리의 다른 글
| [C++] G3 백준 1644 - 소수의 연속합 (클래스5) (0) | 2025.07.20 |
|---|---|
| [C++] G1 백준 12100 - 2048 (Easy) (클래스5) (1) | 2025.07.19 |
| [C++] G2 백준 12015 - 가장 긴 증가하는 부분수열(LIS) 2 (클래스5) (1) | 2025.07.19 |
| [C++] G3 백준 2252 - 줄 세우기(클래스5) (1) | 2025.07.16 |
| [C++] G1 백준 13460 - 구슬탈출2(클래스5) (2) | 2025.07.04 |