C++:: boj 2116 < 주사위 쌓기 >

jahlee·2023년 12월 11일
0

백준_골드

목록 보기
9/24
post-thumbnail

밑면과 윗면의 숫자를 계속 이어서 만들수 있는 기둥은 총 6개로
각 사이드를 잘 조합하여 최대값을 찾으면 되는 문제이다. 크게 어렵지 않다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 주사위 쌓기
vector<int> opposite = {5, 3, 4, 1, 2, 0};

int getMaxSide(int d, int u) {// 위, 아래면 제외 가장 큰 수 반환
	for (int i=6; i>0; i--) {
		if (i != d && i != u) return i;
	}
	return 0;
}

int main() {
	int n;
	cin >> n;
	vector<vector<int>> dices(n, vector<int>(6)), dp(n, vector<int>(6, 0));
	for (int i=0; i<n; i++) {
		for (int j=0; j<6; j++) {
			cin >> dices[i][j];
		}
	}
	for (int i=0; i<6; i++) {// 맨처음 주사위
		dp[0][i] = getMaxSide(dices[0][i], dices[0][opposite[i]]);
	}
	for (int j=0; j<6; j++) {// 이후 주사위
		int down = j;
		for (int i=1; i<n; i++) {
			down = find(dices[i].begin(), dices[i].end(), dices[i-1][opposite[down]]) - dices[i].begin();
			dp[i][j] = dp[i-1][j] + getMaxSide(dices[i][down], dices[i][opposite[down]]);
		}
	}

	cout << *max_element(dp[n-1].begin(), dp[n-1].end());
}

0개의 댓글