Koala - 4기

[BOJ] 2116 주사위 쌓기

코딩하는쉐프 2021. 7. 25. 15:43

첫 번째 주사위를 어떻게 놓는지가 가장 중요해 보였다. 

첫 번째 주사위의 윗면에 따라 나머지 위에 쌓이는 주사위의 옆면의 최대값은 고정이다.

맨 아래 놓인 주사위에 따라 최대값이 달라지기 때문에 처음 주사위의 모든 면을 확인해서 계산 후 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";
}