첫 번째 주사위를 어떻게 놓는지가 가장 중요해 보였다.
첫 번째 주사위의 윗면에 따라 나머지 위에 쌓이는 주사위의 옆면의 최대값은 고정이다.
맨 아래 놓인 주사위에 따라 최대값이 달라지기 때문에 처음 주사위의 모든 면을 확인해서 계산 후 6개의 결과 값들 중 max를 구하면 될 것이라 생각했다.
주사위의 반대 면을 어떻게 확인할까 검색해보니 ABCDEF 순으로 받는 것 보다는 ABCFDE 순으로 받으면 (i+3)%6의 공식이 성립했기 때문에 ABCFDE 순으로 받아서 풀었다.
한 주사위를 확인할 때는 top, bottom이 아닌 것 중에서 가장 큰 값으로 갱신시켰다
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n; cin >> n;
int arr[10001][7];
int ans = 0;
for(int i = 0; i<n; i++){
cin >> arr[i][0] >> arr[i][1] >> arr[i][2] >> arr[i][4] >> arr[i][5] >> arr[i][3];
}
for(int i = 0; i<6; i++){ // 바닥 먼저 기준 잡는데 bruteforce로 다 해봐야함
int bottom = i, res = 0, cnt = 0;
while(cnt < n){ //총 주사위 갯수만큼 각 면마다 모두
int val = 0;
for(int j = 0; j<6; j++){
if(j != bottom && j !=(bottom+3)%6 && val < arr[cnt][j]){ //top,bottom이 아닌 숫자들 중 비교
val = arr[cnt][j]; //max val값 갱신
}
}
res += val;
if(cnt < n-1){
int top = arr[cnt][(bottom+3)%6];
for(int j = 0; j<6; j++){
if(top == arr[cnt+1][j]){
bottom = j;
break;
}
}
}
cnt ++;
}
ans = max(ans, res);
}
cout << ans << "\n";
}
'Koala - 4기' 카테고리의 다른 글
[BOJ] 주사위 쌓기 2116 (0) | 2021.07.26 |
---|---|
[BOJ] 2116 주사위 쌓기 (0) | 2021.07.25 |
[BOJ 1918번] : 후위 표기식 (0) | 2021.07.24 |
[BOJ] 1918 후위표기식 (0) | 2021.07.24 |
[BOJ] 후위 표기식 1918번 (0) | 2021.07.24 |