※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |