본문 바로가기
Problem Solving/BOJ

[Python]5373. 큐빙

by 부르르 2019. 4. 11.

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

 

5373번: 큐빙

문제 루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다. 큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다. 이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란

www.acmicpc.net


큐빙 문제를 풀기전에 아래 문제를 먼저 풀어보자.

https://br-brg.tistory.com/25

 

또한 큐빙 문제를 디버깅하는 동안 아래 사이트를 이용하면 이해하는데 도움이 된다.

https://rubiks-cube-solver.com/ko/

 

아이디어는 

  1. Step1. 기준점 정하고 3차원 배열 생성 (6 X 3 X 3)
  2. Step2. 면 회전 구현
  3. Step3. 기준면과 인접한 면의 이동 구현
  4. Step4. 반시계방향은 시계방향을 3번 반복한 것과 같음을 이용
def clockwise(arr): # 시계방향으로 k번 만큼 회전 ​​​​tmp = arr[0][0] ​​​​arr[0][0] = arr[2][0] ​​​​arr[2][0] = arr[2][2] ​​​​arr[2][2] = arr[0][2] ​​​​arr[0][2] = tmp ​​​​tmp = arr[0][1] ​​​​arr[0][1] = arr[1][0] ​​​​arr[1][0] = arr[2][1] ​​​​arr[2][1] = arr[1][2] ​​​​arr[1][2] = tmp def U(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[0]) ​​​​​​​​tmp = cube[1][0][0], cube[1][0][1], cube[1][0][2] ​​​​​​​​cube[1][0][0], cube[1][0][1], cube[1][0][2] = cube[4][2][0], cube[4][1][0], cube[4][0][0] ​​​​​​​​cube[4][2][0], cube[4][1][0], cube[4][0][0] = cube[5][2][2], cube[5][2][1], cube[5][2][0] ​​​​​​​​cube[5][2][2], cube[5][2][1], cube[5][2][0] = cube[3][0][2], cube[3][1][2], cube[3][2][2] ​​​​​​​​cube[3][0][2], cube[3][1][2], cube[3][2][2] = tmp def D(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[2]) ​​​​​​​​tmp = cube[4][0][2], cube[4][1][2], cube[4][2][2] ​​​​​​​​cube[4][0][2], cube[4][1][2], cube[4][2][2] = cube[1][2][2], cube[1][2][1], cube[1][2][0] ​​​​​​​​cube[1][2][2], cube[1][2][1], cube[1][2][0] = cube[3][2][0], cube[3][1][0], cube[3][0][0] ​​​​​​​​cube[3][2][0], cube[3][1][0], cube[3][0][0] = cube[5][0][0], cube[5][0][1], cube[5][0][2] ​​​​​​​​cube[5][0][0], cube[5][0][1], cube[5][0][2] = tmp def R(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[4]) ​​​​​​​​tmp = cube[0][0][2], cube[0][1][2], cube[0][2][2] ​​​​​​​​cube[0][0][2], cube[0][1][2], cube[0][2][2] = cube[1][0][2], cube[1][1][2], cube[1][2][2] ​​​​​​​​cube[1][0][2], cube[1][1][2], cube[1][2][2] = cube[2][0][2], cube[2][1][2], cube[2][2][2] ​​​​​​​​cube[2][0][2], cube[2][1][2], cube[2][2][2] = cube[5][0][2], cube[5][1][2], cube[5][2][2] ​​​​​​​​cube[5][0][2], cube[5][1][2], cube[5][2][2] = tmp def L(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[3]) ​​​​​​​​tmp = cube[0][0][0], cube[0][1][0], cube[0][2][0] ​​​​​​​​cube[0][0][0], cube[0][1][0], cube[0][2][0] = cube[5][0][0], cube[5][1][0], cube[5][2][0] ​​​​​​​​cube[5][0][0], cube[5][1][0], cube[5][2][0] = cube[2][0][0], cube[2][1][0], cube[2][2][0] ​​​​​​​​cube[2][0][0], cube[2][1][0], cube[2][2][0] = cube[1][0][0], cube[1][1][0], cube[1][2][0] ​​​​​​​​cube[1][0][0], cube[1][1][0], cube[1][2][0] = tmp def F(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[1]) ​​​​​​​​tmp = cube[0][2][0], cube[0][2][1], cube[0][2][2] ​​​​​​​​cube[0][2][0], cube[0][2][1], cube[0][2][2] = cube[3][2][0], cube[3][2][1], cube[3][2][2] ​​​​​​​​cube[3][2][0], cube[3][2][1], cube[3][2][2] = cube[2][0][2], cube[2][0][1], cube[2][0][0] ​​​​​​​​cube[2][0][2], cube[2][0][1], cube[2][0][0] = cube[4][2][0], cube[4][2][1], cube[4][2][2] ​​​​​​​​cube[4][2][0], cube[4][2][1], cube[4][2][2] = tmp def B(c): ​​​​if c == '+': ​​​​​​​​k = 1 ​​​​else: ​​​​​​​​k = 3 ​​​​for _ in range(k): ​​​​​​​​clockwise(cube[5]) ​​​​​​​​tmp = cube[0][0][0], cube[0][0][1], cube[0][0][2] ​​​​​​​​cube[0][0][0], cube[0][0][1], cube[0][0][2] = cube[4][0][0], cube[4][0][1], cube[4][0][2] ​​​​​​​​cube[4][0][0], cube[4][0][1], cube[4][0][2] = cube[2][2][2], cube[2][2][1], cube[2][2][0] ​​​​​​​​cube[2][2][2], cube[2][2][1], cube[2][2][0] = cube[3][0][0], cube[3][0][1], cube[3][0][2] ​​​​​​​​cube[3][0][0], cube[3][0][1], cube[3][0][2] = tmp from copy import deepcopy CUBE = [[[] for _ in range(3)]for _ in range(6)] # 큐브 초기화 s = 'wrygbo' # U F D L R B for i in range(6): ​​​​for j in range(3): ​​​​​​​​for _ in range(3): ​​​​​​​​​​​​CUBE[i][j].append(s[i]) for _ in range(int(input())): ​​​​n = int(input()) ​​​​cmd = input().split() ​​​​cube = deepcopy(CUBE) ​​​​while cmd: ​​​​​​​​c = cmd.pop(0) ​​​​​​​​if c[0] == 'L': ​​​​​​​​​​​​L(c[1]) ​​​​​​​​elif c[0] == 'D': ​​​​​​​​​​​​D(c[1]) ​​​​​​​​elif c[0] == 'U': ​​​​​​​​​​​​U(c[1]) ​​​​​​​​elif c[0] == 'F': ​​​​​​​​​​​​F(c[1]) ​​​​​​​​elif c[0] == 'R': ​​​​​​​​​​​​R(c[1]) ​​​​​​​​elif c[0] == 'B': ​​​​​​​​​​​​B(c[1]) ​​​​for i in range(3): ​​​​​​​​print(''.join(cube[0][i]))
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]17070. 파이프 옮기기1  (0) 2019.04.12
[Python]16918. 봄버맨  (0) 2019.04.11
[Python]16939. 2x2x2 큐브  (0) 2019.04.10
[Python]16235. 나무 재테크  (0) 2019.04.10
[Python]16236. 아기 상어  (0) 2019.04.09

댓글