본문 바로가기
알고리즘 공부/Python

백준 5373 큐빙 (Python)

by 킴워니 2020. 5. 3.

문제는 여기!

 

5373번: 큐빙

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

www.acmicpc.net

 

 

아이디어

 - 바닥은 반대로 하기!

 - 그 이외에는 시뮬레이션을 얼마나 정확하게 하냐에 달려있다! 테스트 케이스를 직접 하나하나 보고 모든 면의 상태를 보고 고쳐주는게 맞다!

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

 

Programme de résolution Rubik's Cube

Le programme de résolution Rubik's Cube en ligne calcule les étapes nécessaires pour résoudre un Rubik's Cube mélangé. Entrez les couleurs de votre puzzle, cliquez sur Résoudre

rubiks-cube-solver.com

도움이 될만한 사이트!

 

- 주변의 면만 바꾸는 것이 아니고 돌려주는 기준 면도 시계방향, 반시계방향에 따라 바뀌기 때문에 그걸 놓치면 테스트 케이스의 네번째 TC에서 아마 통과하지 못할 것이다. (는 나)

 

 

 

 

코드

더보기
"""
백준 5373 큐빙
https://www.acmicpc.net/problem/5373
code written by jungwonkkim
"""

def clockwise(arr):
    newarr = [[0 for _ in range(3)] for _ in range(3)]
    for i in range(3):
        for j in range(3):
            newarr[i][j] = arr[2-j][i]
    return newarr

def anticlockwise(arr):
    newarr = [[0 for _ in range(3)] for _ in range(3)]
    for i in range(3):
        for j in range(3):
            newarr[i][j] = arr[j][2-i]
    return newarr


def move(c):
    global cube
    if c == "U+":
        cube[4][0], cube[3][0], cube[5][0], cube[2][0] = cube[2][0], cube[4][0], cube[3][0], cube[5][0]
        cube[0] = clockwise(cube[0])
        return
    elif c == "U-":
        cube[5][0], cube[3][0], cube[4][0], cube[2][0] = cube[2][0], cube[5][0], cube[3][0], cube[4][0]
        cube[0] = anticlockwise(cube[0])
        return
    elif c == "D-":
        cube[4][2], cube[3][2], cube[5][2], cube[2][2] = cube[2][2], cube[4][2], cube[3][2], cube[5][2]
        cube[1] = anticlockwise(cube[1])
        return
    elif c == "D+":
        cube[5][2], cube[3][2], cube[4][2], cube[2][2] = cube[2][2], cube[5][2], cube[3][2], cube[4][2]
        cube[1] = clockwise(cube[1])
        return
    elif c == "F+":
        a, b, c = 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][0][0], cube[1][0][1], cube[1][0][2]
        cube[1][0][0], cube[1][0][1], cube[1][0][2] = cube[5][2][0], cube[5][1][0], cube[5][0][0]
        cube[5][2][0], cube[5][1][0], cube[5][0][0] = cube[0][2][2], cube[0][2][1], cube[0][2][0]
        cube[0][2][2], cube[0][2][1], cube[0][2][0] = a, b, c
        cube[2] = clockwise(cube[2])
        return
    elif c == "F-":
        a, b, c = 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[0][2][2], cube[0][2][1], cube[0][2][0]
        cube[0][2][2], cube[0][2][1], cube[0][2][0] = cube[5][2][0], cube[5][1][0], cube[5][0][0]
        cube[5][2][0], cube[5][1][0], cube[5][0][0] = cube[1][0][0], cube[1][0][1], cube[1][0][2]
        cube[1][0][0], cube[1][0][1], cube[1][0][2] = a, b, c
        cube[2] = anticlockwise(cube[2])
        return
    elif c == "B+":
        a, b, c = cube[4][0][0], cube[4][1][0], cube[4][2][0]
        cube[4][0][0], cube[4][1][0], cube[4][2][0] = cube[0][0][2], cube[0][0][1], cube[0][0][0]
        cube[0][0][2], cube[0][0][1], cube[0][0][0] = cube[5][2][2], cube[5][1][2], cube[5][0][2]
        cube[5][2][2], cube[5][1][2], cube[5][0][2] = cube[1][2][0], cube[1][2][1], cube[1][2][2]
        cube[1][2][0], cube[1][2][1], cube[1][2][2] = a, b, c
        cube[3] = clockwise(cube[3])
        return
    elif c == "B-":
        a, b, c = cube[4][0][0], cube[4][1][0], cube[4][2][0]
        cube[4][0][0], cube[4][1][0], cube[4][2][0] = cube[1][2][0], cube[1][2][1], cube[1][2][2]
        cube[1][2][0], cube[1][2][1], cube[1][2][2] = cube[5][2][2], cube[5][1][2], cube[5][0][2]
        cube[5][2][2], cube[5][1][2], cube[5][0][2] = cube[0][0][2], cube[0][0][1], cube[0][0][0]
        cube[0][0][2], cube[0][0][1], cube[0][0][0] = a, b, c
        cube[3] = anticlockwise(cube[3])
        return
    elif c == "L+":
        a, b, c = 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[3][2][2], cube[3][1][2], cube[3][0][2]
        cube[3][2][2], cube[3][1][2], cube[3][0][2] = cube[1][0][0], cube[1][1][0], cube[1][2][0]
        cube[1][0][0], cube[1][1][0], cube[1][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] = a, b, c
        cube[4] = clockwise(cube[4])
        return
    elif c == "L-":
        a, b, c = 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[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] = cube[3][2][2], cube[3][1][2], cube[3][0][2]
        cube[3][2][2], cube[3][1][2], cube[3][0][2] = a, b, c
        cube[4] = anticlockwise(cube[4])
        return
    elif c == "R+":
        a, b, c = 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[2][0][2], cube[2][1][2], cube[2][2][2]
        cube[2][0][2], cube[2][1][2], cube[2][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[3][2][0], cube[3][1][0], cube[3][0][0]
        cube[3][2][0], cube[3][1][0], cube[3][0][0] = a, b, c
        cube[5] = clockwise(cube[5])
        return
    else:
        a, b, c = 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[3][2][0], cube[3][1][0], cube[3][0][0]
        cube[3][2][0], cube[3][1][0], cube[3][0][0] = 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] = a, b, c
        cube[5] = anticlockwise(cube[5])
        return



T = int(input())
for test_case in range(T):
    cube = [[['w','w','w'],['w','w','w'],['w','w','w']],[['y','y','y'],['y','y','y'],['y','y','y']],[['r','r','r'],['r','r','r'],['r','r','r']],[['o','o','o'],['o','o','o'],['o','o','o']],[['g','g','g'],['g','g','g'],['g','g','g']],[['b','b','b'],['b','b','b'],['b','b','b']]]
    N = int(input())
    commands = list(input().split())
    for command in commands:
        move(command)
    for i in range(3):
        ans = ''.join(cube[0][i])
        print(ans)

 

댓글