본문 바로가기

카테고리 없음

[백준 5373번] 큐빙 (Python3)

import sys
input = sys.stdin.readline
from copy import deepcopy

def turnplane(x):
  plane = [[0]*3 for i in range(3)]
  for i in range(3):
    for j in range(3):
      plane[j][2-i] = cube[x][i][j]
  cube[x] = plane
#옆면 4개는 앞에서 바라볼때 기준 윗면 아랫면은 대칭
def turnside(x):
  if x == "U":
    a,b,c = cube["F"][0]
    cube["F"][0] = [*cube["R"][0]]
    cube["R"][0] = [*cube["B"][0]]
    cube["B"][0] = [*cube["L"][0]]
    cube["L"][0] = [a,b,c]
  elif x == "D":
    a,b,c = cube["F"][2]
    cube["F"][2] = [*cube["L"][2]]
    cube["L"][2] = [*cube["B"][2]]
    cube["B"][2] = [*cube["R"][2]]
    cube["R"][2] = [a,b,c]
  elif x == "F":
    a,b,c = cube["U"][2]
    cube["U"][2] = [cube["L"][2][2],cube["L"][1][2],cube["L"][0][2]]
    cube["L"][2][2],cube["L"][1][2],cube["L"][0][2] = cube["D"][2]
    cube["D"][2] = [cube["R"][0][0],cube["R"][1][0],cube["R"][2][0]]
    cube["R"][0][0],cube["R"][1][0],cube["R"][2][0] = a,b,c
  elif x == "B":
    a,b,c = cube["U"][0]
    cube["U"][0] = [cube["R"][0][2],cube["R"][1][2],cube["R"][2][2]]
    cube["R"][0][2],cube["R"][1][2],cube["R"][2][2] = cube["D"][0]
    cube["D"][0] = [cube["L"][2][0],cube["L"][1][0],cube["L"][0][0]]
    cube["L"][2][0],cube["L"][1][0],cube["L"][0][0] = a,b,c
  elif x == "L":
    a,b,c = cube["U"][0][0],cube["U"][1][0],cube["U"][2][0]
    cube["U"][0][0],cube["U"][1][0],cube["U"][2][0] = cube["B"][2][2],cube["B"][1][2],cube["B"][0][2]
    cube["B"][2][2],cube["B"][1][2],cube["B"][0][2] = cube["D"][2][2],cube["D"][1][2],cube["D"][0][2]
    cube["D"][2][2],cube["D"][1][2],cube["D"][0][2] = cube["F"][0][0],cube["F"][1][0],cube["F"][2][0]
    cube["F"][0][0],cube["F"][1][0],cube["F"][2][0] = a,b,c
  elif x == "R":
    a,b,c = cube["U"][2][2],cube["U"][1][2],cube["U"][0][2]
    cube["U"][2][2],cube["U"][1][2],cube["U"][0][2] = cube["F"][2][2],cube["F"][1][2],cube["F"][0][2]
    cube["F"][2][2],cube["F"][1][2],cube["F"][0][2] = cube["D"][0][0],cube["D"][1][0],cube["D"][2][0]
    cube["D"][0][0],cube["D"][1][0],cube["D"][2][0] = cube["B"][0][0],cube["B"][1][0],cube["B"][2][0]
    cube["B"][0][0],cube["B"][1][0],cube["B"][2][0] = a,b,c    

T = int(input())
for _ in range(T):
  cube = {i:[[0]*3 for _ in range(3)] for i in "UDFBLR"}
  for n in range(6):
    for i in range(3):
      for j in range(3):
        cube["UDFBLR"[n]][i][j] = "wyrogb"[n]
  
  N = int(input())
  data = [*input().split()]
  for i in range(N):
    x,d = data[i]
    if d == "+":
      turnplane(x)
      turnside(x)
    else:
      for _ in range(3):
        turnplane(x)
        turnside(x)
  print(*map(lambda x:"".join(x),cube["U"]),sep="\n")

노가다의 끝판왕 문제

코드 짜는데도 한세월이고 디버깅도 만만치않다.

 

알고리즘적으로 어려운 점은 단 하나도 없다.

그나마 알고리즘적이라 할만한건 시계 반대방향으로 돌리는건 시계방향으로 3번 돌리는 것과 같다 정도? 근데 이건 뭐 누구나 생각할 수 있는거고

 

현재 면에 대해서 90도 돌리는 turnplane 함수와, 현재 면을 돌릴때 일어나는 turnside 함수를 만들어주면 끝이다.

하지만 turnside 함수를 만드는게 정말 말 그대로 노가다라서...

 

머릿속으로 큐브를 그리고 돌릴 때마다 일어나는 변화를 상상하면 좀 더 쉽게 만들 수 있을 것이다.

 

 

오늘의 교훈) 단순 노가다 문제도 플래티넘이 될 수 있다?!