chldkato

백준 5373 큐빙 (파이썬) 본문

백준

백준 5373 큐빙 (파이썬)

chldkato 2020. 4. 14. 00:27

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

 

5373번: 큐빙

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

www.acmicpc.net

전개도, 방향, 인덱스를 신경써서 코딩해야한다

윗면, 아랫면을 돌리는 경우는 서로 비슷해서 묶어서 해결할 수 있다. 이는 좌우, 앞뒤도 마찬가지다

큐브의 전개도를 펼쳤을 때 인덱스 순서가 어떻게 되느냐가 중요하다

 

아래의 코드는 전개도를 세로로 길게 펼치고 가운데가 U일 때,

u, l, r, f, b는 0~2 순서로 d는 2~0 순서로 정했다

그러면 u방향에서 봤을 때 u와 d의 순서는 일치한다

 

1. 큐브 리스트 u, d, l, r, f, b를 매 테스트 케이스마다 만든다

2. 입력받은 회전할 면과 방향을 cube 함수에 입력한다.

3. 위아래, 앞뒤, 좌우를 돌리는 경우 3가지로 조건문을 처리한다

   매 경우마다 회전할 면과 방향을 turn 함수에 입력하여 해당 면부터 우선 회전한다

4. 이제는 모든 회전 케이스를 꼼꼼하게 설계하면 된다

   코드처럼 윗면을 시계방향 회전하는 것과 아랫면을 반시계 회전하는 것은 유사하고 이는 다른 면도 마찬가지

5. 모든 회전을 마치고 윗면의 색을 출력한다

import sys

input = sys.stdin.readline

def cube(side, dir):
    global u, d, f, b, l, r
    if side == 'U' or side == 'D':
        if side == 'U':
            u = turn(u, dir)
            i, j = 2, 0
        else:
            d = turn(d, dir)
            i, j = 0, 2
        temp_l = [list(x) for x in zip(*l)]
        temp_r = [list(x) for x in zip(*r)]
        temp = b[i]
        if (side == 'U' and dir == '+') or (side == 'D' and dir == '-'):
            b[i] = list(reversed(temp_l[i]))
            temp_l[i] = f[j]
            f[j] = list(reversed(temp_r[j]))
            temp_r[j] = temp
        else:
            b[i] = temp_r[j]
            temp_r[j] = list(reversed(f[j]))
            f[j] = temp_l[i]
            temp_l[i] = list(reversed(temp))
        l = [list(x) for x in zip(*temp_l)]
        r = [list(x) for x in zip(*temp_r)]

    elif side == 'F' or side == 'B':
        if side == 'F':
            f = turn(f, dir)
            i = 2
        else:
            b = turn(b, dir)
            i = 0
        temp = u[i]
        if (side == 'F' and dir == '+') or (side == 'B' and dir == '-'):
            u[i] = l[i]
            l[i] = d[i]
            d[i] = r[i]
            r[i] = temp
        else:
            u[i] = r[i]
            r[i] = d[i]
            d[i] = l[i]
            l[i] = temp

    elif side == 'L' or side == 'R':
        if side == 'L':
            l = turn(l, dir)
            i, j = 0, 2
        else:
            r = turn(r, dir)
            i, j = 2, 0
        temp_u = [list(x) for x in zip(*u)]
        temp_d = [list(x) for x in zip(*d)]
        temp_f = [list(x) for x in zip(*f)]
        temp_b = [list(x) for x in zip(*b)]
        temp = temp_b[i]
        if (side == 'L' and dir == '+') or (side == 'R' and dir == '-'):
            temp_b[i] = list(reversed(temp_d[j]))
            temp_d[j] = list(reversed(temp_f[i]))
            temp_f[i] = temp_u[i]
            temp_u[i] = temp
        else:
            temp_b[i] = temp_u[i]
            temp_u[i] = temp_f[i]
            temp_f[i] = list(reversed(temp_d[j]))
            temp_d[j] = list(reversed(temp))
        u = [list(x) for x in zip(*temp_u)]
        d = [list(x) for x in zip(*temp_d)]
        f = [list(x) for x in zip(*temp_f)]
        b = [list(x) for x in zip(*temp_b)]


def turn(side, dir):
    if dir == '+':
        return [list(reversed(x)) for x in zip(*side)]
    else:
        side = [list(x) for x in zip(*side)]
        temp = side[0]
        side[0] = side[2]
        side[2] = temp
        return side


tc = int(input())
for _ in range(tc):
    u = [['w' for _ in range(3)] for _ in range(3)]
    d = [['y' for _ in range(3)] for _ in range(3)]
    f = [['r' for _ in range(3)] for _ in range(3)]
    b = [['o' for _ in range(3)] for _ in range(3)]
    l = [['g' for _ in range(3)] for _ in range(3)]
    r = [['b' for _ in range(3)] for _ in range(3)]

    n = int(input())
    case = list(input().strip().split())
    for k in case:
        side, dir = list(k)
        cube(side, dir)
    for s in u:
        print(''.join(s))

'백준' 카테고리의 다른 글

백준 15685 드래곤 커브 (파이썬)  (0) 2020.04.14
백준 15686 치킨 배달 (파이썬)  (0) 2020.04.14
백준 5213 과외맨 (파이썬)  (0) 2020.04.12
백준 2186 문자판 (파이썬)  (0) 2020.04.10
백준 3108 로고 (파이썬)  (4) 2020.04.09
Comments