Koala - 14기/코딩테스트 준비 스터디
[백준 2116 cpp] 주사위 쌓기
code_with_coffee
2024. 3. 17. 14:54
문제 분석
입력의 형태는 주사위의 전개도 값을 주어진다. 이때 주사위의 값의 패턴이 없기 때문에 주사위가 쌓일 때 바닥과 천장의 값을 직접 찾아야 하고 같은 이유로 측면에 놓이는 값들을 구해야한다.
한 쪽 측면에 놓이는 값들의 합중에서 가장 큰 수를 원하기 때문에 한개의 주사위의 옆면에 해당하는 값들중 가장 큰 수만 선정하면 된다. 즉 주사위를 쌓는 경우에 대해서 찾으면 값은 알 수 있게 된다는 의미이다.
#include <iostream>
#include <algorithm>
using namespace std;
// 아래면의 인덱스를 윗면으로 단순히 바꿔줌
int top_val(int index) {
if (index == 0) return 5;
if (index == 1) return 3;
if (index == 2) return 4;
if (index == 3) return 1;
if (index == 4) return 2;
if (index == 5) return 0;
return 0;
}
int main() {
int N;
int map[10000][6];
cin >> N;
for (int i = 0; i < N; i++) {
for (int s = 0; s < 6; s++) {
cin >> map[i][s];
}
}
int ans = 0;
for (int a = 0; a < 6; a++) {
int temp_ans = 0;
int index = a;
int max_val = 0;
for (int i = 0; i < N - 1; i++) {
max_val = 0;
index = top_val(index);
for (int s = 0; s < 6; s++) {
if (map[i + 1][s] == map[i][index]) {
for (int x = 0; x < 6; x++) {
if (x == index || x == top_val(index)) { continue; }
else max_val = max(max_val, map[i][x]);
}
index = s;
break;
}
}
temp_ans += max_val;
}
max_val = 0;
index = top_val(index);
for (int x = 0; x < 6; x++) {
if (x == index || x == top_val(index)) { continue; }
else max_val = max(max_val, map[N - 1][x]);
}
temp_ans += max_val;
ans = max(temp_ans, ans);
}
cout << ans;
return 0;
}