본문 바로가기
전공공부/코딩테스트

(c++) 백준 "2116) 주사위 쌓기"

by 시아나 2022. 4. 25.

https://www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net


#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;
int N;
vector<vector<int>> dices;
unordered_map<int,int> p = { {0,5},{1,3},{2,4},{3,1},{4,2},{5,0} };
vector<int> scores = { 0,0,0,0,0,0 };

int find_best(int index,int i) {
	int max = 0;
	for (int k = 0; k < 6; k++) {
		if (k != i && k != p[i] && max < dices[index][k]) {
			max = dices[index][k];
		}
	}
	return max;
}

void solution() {
	for (int i = 0; i < dices[0].size(); i++) {
		scores[i] += find_best(0,i);
	}
	for (int i = 1; i < dices.size(); i++) {
		vector<int> tmp(6);
		for (int k = 0; k < 6; k++) {
			int num = dices[i - 1][p[k]]; //위로가야하는 숫자
			int n = find(dices[i].begin(), dices[i].end(), num) - dices[i].begin();
			tmp[n] = scores[k];
		}
		scores.assign(tmp.begin(), tmp.end());
		for (int k = 0; k < 6; k++) {
			scores[k] += find_best(i, k);
		}
	}
	cout << *max_element(scores.begin(), scores.end()) << endl;
}

int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		vector<int> tmp;
		for (int k = 0; k < 6; k++) {
			int n; cin >> n;
			tmp.push_back(n);
		}
		dices.push_back(tmp);
	}
	solution();
	return 0;
}