728x90
https://www.acmicpc.net/problem/16939
22/11/10
전형적인 구현 문제로, 큐브의 움직임을 따라가며 차근차근 구현하면 맞을 수 있는 문제이다.
문제 접근 방식:
아래 그림을 보자.
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)
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 21344번 Hot Spring (0) | 2022.11.16 |
---|---|
[Python] 7787번 빨간 칩, 초록 칩 (0) | 2022.11.15 |
[Python] 11973번 Angry Cows (Silver) (0) | 2022.11.10 |
[Python] 7869번 두 원 (0) | 2022.11.10 |
[Python] 25921번 건너 아는 사이 (0) | 2022.11.09 |