Koala - 4기

[BOJ] 주사위 쌓기 2116

알 수 없는 사용자 2021. 7. 26. 02:58

문제에서 가장 중점적으로 봤던 부분

1. 첫 번째 주사위가 놓이는 방향

2. 주사위를 쌓았을 때 bottom과 top이 아닌 수 중에서 가장 큰 수가 더해지는 값이 된다는 점.

 

문제 풀이 방법

1. bottom의 인덱스가 0~6일 때 top의 인덱스를 구해주어 bottom과 top을 저장하는 백터에 넣어주었습니다.

2. bottom과 top이 모두 6이 아니라면 6을, bottom이 5, top이 6(bottom이 6, top이 5)의 상황인 경우 4를, 그 이외에는 5를 sum에 더해주었습니다.

3. 최종적으로 maxsum을 구해서 가장 큰 수를 출력합니다.

 

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

using namespace std;

int dia[10001][6];
vector<pair<int, int>> vec[10001];

int n, bottom, top, sum = 0, maxsum = 0;
 int diasum() {
	if (bottom != 6 && top != 6) {
		return 6;
	}
	else {
		if ((bottom == 6 && top == 5) || (bottom == 5 && top == 6)) return 4;
		else {
			return 5;
		}
	}
}
int main(void) {
	
	
	cin >> n;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 6; j++) {
			cin >> dia[i][j];
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 6; j++) {
			bottom = j;
			if (bottom == 0) top = 5;
			else if (bottom == 1 || bottom == 2) top = bottom + 2;
			else if (bottom == 3 || bottom == 4) top = bottom - 2;
			else if (bottom == 5) top = 0;

			vec[i].push_back(make_pair(dia[i][bottom], dia[i][top]));
		}
	}

	
	for (int k = 0; k < 6; k++) {
		bottom = vec[0][k].first;
		top = vec[0][k].second;

		sum += diasum();

		for (int i = 1; i < n; i++) {
			for (int j = 0; j < 6; j++) {
				if (top == vec[i][j].first) {
					bottom = vec[i][j].first;
					top = vec[i][j].second;
				}
				else continue;

				sum += diasum();
				break;
			}
		}
		maxsum = max(sum, maxsum);
		sum = 0;
	}
	cout << maxsum;
	
}