※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2116번 문제인 주사위 쌓기이다.
문제는 아래 링크를 확인하자.

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

 

2116번: 주사위 쌓기

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

www.acmicpc.net

맨 아래의 주사위의 밑면을 하나 고정한다면, 쌓은 주사위의 각 층에 사용될 수 있는 옆면의 수는 네 종류로 전부 고정됨을 관찰하자. 이 관찰을 이용하면 각 주사위의 밑면을 고정하는 여섯 경우에 대한 탐색을 통해 문제를 간단히 해결할 수 있다.

 

이를 구현하는 것은 어렵지 않다. (1) 밑면에 있던 수를 마주보는 면에 있는 수로 바꾸고 (2) 앞에서 나온 두 수를 제외한 수 중 최댓값을 더하는 두 작업을 반복하는 코드를 작성하는 것으로 구현할 수 있기 때문이다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N;
int psum[6];
int uface[6] = { 1,2,3,4,5,6 };

int mx;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	while (N--) {
		int a, b, c, d, e, f; cin >> a >> b >> c >> d >> e >> f;
		for (int i = 0; i < 6; i++) {
			int& cur = uface[i];
			if (cur == a) cur = f, psum[i] += max(max(b, c), max(d, e));
			else if (cur == b) cur = d, psum[i] += max(max(a, c), max(e, f));
			else if (cur == c) cur = e, psum[i] += max(max(a, b), max(d, f));
			else if (cur == d) cur = b, psum[i] += max(max(a, c), max(e, f));
			else if (cur == e) cur = c, psum[i] += max(max(a, b), max(d, f));
			else cur = a, psum[i] += max(max(b, c), max(d, e));
		}
	}

	for (int i = 0; i < 6; i++) mx = max(mx, psum[i]);

	cout << mx;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 4883 // C++] 삼각 그래프  (0) 2023.03.10
[BOJ 2618 // C++] 경찰차  (0) 2023.03.10
[BOJ 25378 // C++] 조약돌  (0) 2023.03.09
[BOJ 27866 // C++] 문자와 문자열  (0) 2023.03.09
[BOJ 27865 // C++] 랜덤 게임?  (0) 2023.03.09

+ Recent posts