본문 바로가기
알고리즘/백준

[백준 5373] 큐빙 (C++)

by Bloofer 2020. 3. 12.

A. 문제설명

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

문제에 대한 자세한 설명은 링크 참조

 

1. 3 * 3 정육면체의 큐브가 존재

2. 큐브의 각 면에는 위:흰색, 아래:노란색, 앞:빨간색, 뒤:오렌지색, 왼:초록색, 오른:파란색으로 색칠됨

3. 큐브를 돌리는 횟수와 돌리는 면 및 방향(시계/반시계)이 주어짐

4. 주어진 대로 큐브를 모두 돌리고 난 후 윗면 9개 칸의 색상을 출력

 

문제의 조건은 사실 간단하다. 3 * 3 정육면체 루빅스 큐브를 구현하여 모사하면 되는 것

 

B. 접근법

큐브를 6개의 3*3 배열로 나누어 좌표에 유의하여 구현한다. 면의 회전방향이 보는 각도에 따라 달라지며 우리가 정의하는 X, Y의 좌표가 뒤집어진 면에서는 그에 맞추어야 하므로 전개도를 그려 헷갈리지 않도록 유의

더러운... 시뮬레이션 문제...

 

C. 풀이

1. 상(U)/하(D)/앞(F)/뒤(B)는 일반적인 전개도를 그려서 좌표의 회전을 예상하고

2. 좌(L)/우(R)는 처음의 전개도에서 위아랫면이 90도 뒤집어진 형태의 전개도를 그린다.

전개도를 그린 후 회전 방식은 위와 같이 예상해 볼 수 있다. 다른 면 및 반시계 방향의 회전도 이와 같이 디자인한다.

 

3. 전개도를 그리는 방식이 따로 정해져 있는 것은 아니다. 처음 큐브를 디자인하고 3D 배열에 인코딩했을 때 각면 내 색상 엔트리를 나타내는 배열과 그 엔트리가 나중에 각 면에 따라 큐브를 돌려가면서 꼬이지 않도록 기준을 정해주는 것이 좋다.

4. 주어진 대로 모든 큐브의 회전 조건을 수행한 뒤 윗면 색상을 출력

* 자잘한 케이스가 많아 실수하기 딱 좋은 문제이다. 나의 경우 각 면의 회전 함수를 최대한 모듈화하여 중간과정을 확인하며 구현하였다.

D. 내 코드