본문 바로가기

알고리즘/백준 문제 풀이

[Python] 16939번 2×2×2 큐브

728x90

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

 

16939번: 2×2×2 큐브

첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.

www.acmicpc.net


 

22/11/10

 

 

전형적인 구현 문제로, 큐브의 움직임을 따라가며 차근차근 구현하면 맞을 수 있는 문제이다.


 

문제 접근 방식:

 

 

아래 그림을 보자.

출처: https://dm19sky.tistory.com/264

2*2*2 큐브에서 나올 수 있는 모든 회전들을 기호로 표현한 것으로, 총 12가지가 있다.

 

나는 5678이 새겨진 면을 맨 윗면으로 고정시켜놓고, 저렇게 한 번 회전시키는 것을 각각의 함수로 구현하였다.

 

다시 말해, 총 12가지의 함수를 구현한 것이다.

 

이 함수는 큐브 리스트를 입력받아 회전된 큐브 리스트를 반환하는 함수이다.

 

 

또 한 가지 함수, is_solved를 구현했는데, 이는 큐브 리스트를 입력받아 현재 모든 면이 각각 전부 완벽하게 맞춰져 있는가를 확인하는 함수로, 한 면은 4를 기준으로 끊겨있으므로 이를 이용하여 구현하였다.

 

 

12가지 함수와 위의 함수를 이용하여, 12가지 함수를 통해 나온 큐브 리스트들, 즉, 한 번씩 돌린 큐브 리스트들이 완벽하게 맞춰져 있는지 판단하는 check_rotate_once함수를 구현했다.

 

이 함수는 만약 완벽하게 맞춰져 있는 큐브가 존재하면 True를, 아니면 False를 반환하는 함수이다.

 

 

주어진 전개도를 이용하여 3차원 큐브를 가상으로 돌린다고 생각하고 구현하였다.

 

자세한 내용은 코드를 통해 확인하는 것이 좋을 것이다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 16939번 2×2×2 큐브
# 구현
'''
접근 방법:
5678이 그려진 면이 윗면이라고 생각하고 돌리자.
'''
def is_solved(cube):
    for i in range(6):
        one_side = set()
        for j in range(1, 5):
            one_side.add(cube[4*i+j])
        if len(one_side) > 1:
            return False
    return True
def R(cube):
    two, four = cube[2], cube[4]
    six, eight = cube[6], cube[8]
    ten, twelve = cube[10], cube[12]
    twentyone, twentythree = cube[21], cube[23]
    cube[2], cube[4] = six, eight
    cube[6], cube[8] = ten, twelve
    cube[10], cube[12] = twentythree, twentyone
    cube[21], cube[23] = four, two
    cube[17], cube[18], cube[19], cube[20] = cube[19], cube[17], cube[20], cube[18]
    return cube
def r(cube):
    two, four = cube[2], cube[4]
    six, eight = cube[6], cube[8]
    ten, twelve = cube[10], cube[12]
    twentyone, twentythree = cube[21], cube[23]
    cube[2], cube[4] = twentythree, twentyone
    cube[6], cube[8] = two, four
    cube[10], cube[12] = six, eight
    cube[21], cube[23] = twelve, ten
    cube[17], cube[18], cube[19], cube[20] = cube[18], cube[20], cube[17], cube[19]
    return cube
def L(cube):
    one, three = cube[1], cube[3]
    five, seven = cube[5], cube[7]
    nine, eleven = cube[9], cube[11]
    twentytwo, twentyfour = cube[22], cube[24]
    cube[1], cube[3] = twentyfour, twentytwo
    cube[5], cube[7] = one, three
    cube[9], cube[11] = five, seven
    cube[22], cube[24] = eleven, nine
    cube[13], cube[14], cube[15], cube[16] = cube[15], cube[13], cube[16], cube[14]
    return cube
def l(cube):
    one, three = cube[1], cube[3]
    five, seven = cube[5], cube[7]
    nine, eleven = cube[9], cube[11]
    twentytwo, twentyfour = cube[22], cube[24]
    cube[1], cube[3] = five, seven
    cube[5], cube[7] = nine, eleven
    cube[9], cube[11] = twentyfour, twentytwo
    cube[22], cube[24] = three, one
    cube[13], cube[14], cube[15], cube[16] = cube[14], cube[16], cube[13], cube[15]
    return cube
def B(cube):
    five, six = cube[5], cube[6]
    thirteen, fourteen = cube[13], cube[14]
    seventeen, eighteen = cube[17], cube[18]
    twentyone, twentytwo = cube[21], cube[22]
    cube[5], cube[6] = seventeen, eighteen
    cube[13], cube[14] = five, six
    cube[21], cube[22] = thirteen, fourteen
    cube[17], cube[18] = twentyone, twentytwo
    cube[1], cube[2], cube[3], cube[4] = cube[3], cube[1], cube[4], cube[2]
    return cube
def b(cube):
    five, six = cube[5], cube[6]
    thirteen, fourteen = cube[13], cube[14]
    seventeen, eighteen = cube[17], cube[18]
    twentyone, twentytwo = cube[21], cube[22]
    cube[5], cube[6] = thirteen, fourteen
    cube[13], cube[14] = twentyone, twentytwo
    cube[21], cube[22] = seventeen, eighteen
    cube[17], cube[18] = five, six
    cube[1], cube[2], cube[3], cube[4] = cube[2], cube[4], cube[1], cube[3]
    return cube
def F(cube):
    seven, eight = cube[7], cube[8]
    fifteen, sixteen = cube[15], cube[16]
    nineteen, twenty = cube[19], cube[20]
    twentythree, twentyfour = cube[23], cube[24]
    cube[7], cube[8] = fifteen, sixteen
    cube[15], cube[16] = twentythree, twentyfour
    cube[19], cube[20] = seven, eight
    cube[23], cube[24] = nineteen, twenty
    cube[9], cube[10], cube[11], cube[12] = cube[11], cube[9], cube[12], cube[10]
    return cube
def f(cube):
    seven, eight = cube[7], cube[8]
    fifteen, sixteen = cube[15], cube[16]
    nineteen, twenty = cube[19], cube[20]
    twentythree, twentyfour = cube[23], cube[24]
    cube[7], cube[8] = nineteen, twenty
    cube[15], cube[16] = seven, eight
    cube[19], cube[20] = twentythree, twentyfour
    cube[23], cube[24] = fifteen, sixteen
    cube[9], cube[10], cube[11], cube[12] = cube[10], cube[12], cube[9], cube[11]
    return cube    
def D(cube):
    one, two = cube[1], cube[2]
    eleven, twelve = cube[11], cube[12]
    thirteen, fifteen = cube[13], cube[15]
    eighteen, twenty = cube[18], cube[20]
    cube[1], cube[2] = eighteen, twenty
    cube[11], cube[12] = thirteen, fifteen
    cube[13], cube[15] = two, one
    cube[18], cube[20] = twelve, eleven
    cube[21], cube[22], cube[23], cube[24] = cube[23], cube[21], cube[24], cube[22]
    return cube
def d(cube):
    one, two = cube[1], cube[2]
    eleven, twelve = cube[11], cube[12]
    thirteen, fifteen = cube[13], cube[15]
    eighteen, twenty = cube[18], cube[20]
    cube[1], cube[2] = fifteen, thirteen
    cube[11], cube[12] = twenty, eighteen
    cube[13], cube[15] = eleven, twelve
    cube[18], cube[20] = one, two
    cube[21], cube[22], cube[23], cube[24] = cube[22], cube[24], cube[21], cube[23]
    return cube
def U(cube):
    three, four = cube[3], cube[4]
    nine, ten = cube[9], cube[10]
    fourteen, sixteen = cube[14], cube[16]
    seventeen, nineteen = cube[17], cube[19]
    cube[3], cube[4] = sixteen, fourteen
    cube[9], cube[10] = nineteen, seventeen
    cube[14], cube[16] = nine, ten
    cube[17], cube[19] = three, four
    cube[5], cube[6], cube[7], cube[8] = cube[7], cube[5], cube[8], cube[6]
    return cube
def u(cube):
    three, four = cube[3], cube[4]
    nine, ten = cube[9], cube[10]
    fourteen, sixteen = cube[14], cube[16]
    seventeen, nineteen = cube[17], cube[19]
    cube[3], cube[4] = seventeen, nineteen
    cube[9], cube[10] = fourteen, sixteen
    cube[14], cube[16] = four, three
    cube[17], cube[19] = ten, nine
    cube[5], cube[6], cube[7], cube[8] = cube[6], cube[8], cube[5], cube[7]
    return cube
def check_rotate_once(cube):
    UP, up, DOWN, down, FRONT, front = U(cube[:]), u(cube[:]), D(cube[:]), d(cube[:]), F(cube[:]), f(cube[:])
    BACK, back, LEFT, left, RIGHT, right = B(cube[:]), b(cube[:]), L(cube[:]), l(cube[:]), R(cube[:]), r(cube[:])
    cube_list = [UP, up, DOWN, down, FRONT, front, BACK, back, LEFT, left, RIGHT, right]
    for rotated_cube in cube_list:
        if is_solved(rotated_cube):
            return True
    else:
        return False
CUBE = [0] + list(map(int, input().split()))
print(1 if check_rotate_once(CUBE) else 0)