오늘은 2×2×2 루빅스 큐브를 풀어보려고 한다. 큐브의 각 면은 양방향으로 90도 돌릴 수 있게 만들어져 있다. 큐브의 각 면에 있는 색상이 모두 같으면 큐브를 풀었다고 한다.
2×2×2 루빅스 큐브가 주어졌을 때, 정확히 한 번 돌려서 큐브를 풀 수 있는지 아닌지 구해보자.
루빅스 큐브를 단 한번 돌렸을 때 큐브를 풀 수 있는지 출력하라.
먼저 큐브에서 돌릴 수 있는 경우의 수를 전부 세본다. 큐브는 총 x축, y축, z축의 3가지 방향으로 돌릴 수 있다. 이는 한쪽으로 90도 반대쪽으로 90도를 돌릴 수 있기 때문에 총 회전하는 경우의 수는 12가지가 된다. 큐브를 회전하면 바뀌는 값은 총 8개의 값이 한쪽으로 2칸 Shift 한것과 같다. 예제에서 예를 들면 13, 14, 5, 6... 방향으로 회전하면 13은 5로 14는 6으로 두칸씩 회전한다. 이를 한 방향과 반대 방향 모두 구현한 뒤 6개의 조합에서 전부 돌려본다. 만약 돌린 뒤 6면의 색깔이 각 면에서 통일된다면 이를 정답으로 처리한다.
import sys
def is_finish(cube_):
j = 1
count = 0
while j < 24:
if cube_[j] == cube_[j + 1] == cube_[j + 2] == cube_[j + 3]:
count += 1
j += 4
if count == 6:
return True
return False
squares = [[13, 14, 5, 6, 17, 18, 21, 22],
[15, 16, 7, 8, 19, 20, 23, 24],
[1, 3, 5, 7, 9, 11, 24, 22],
[2, 4, 6, 8, 10, 12, 23, 21],
[3, 4, 17, 19, 10, 9, 16, 14],
[1, 2, 18, 20, 12, 11, 15, 13]]
result = 0
cube = [0] + list(map(int, sys.stdin.readline().split()))
for s in squares:
copy_cube = cube[:]
color1 = copy_cube[s[6]]
color2 = copy_cube[s[7]]
for i in range(6, 1, -2):
copy_cube[s[i]] = copy_cube[s[i - 2]]
copy_cube[s[i + 1]] = copy_cube[s[i - 1]]
copy_cube[s[0]] = color1
copy_cube[s[1]] = color2
if is_finish(copy_cube):
result = 1
copy_cube = cube[:]
color1 = copy_cube[s[0]]
color2 = copy_cube[s[1]]
for i in range(2, 7, 2):
copy_cube[s[i - 2]] = copy_cube[s[i]]
copy_cube[s[i - 1]] = copy_cube[s[i + 1]]
copy_cube[s[6]] = color1
copy_cube[s[7]] = color2
if is_finish(copy_cube):
result = 1
print(result)
구현은 차근차근 접근하였기에 어렵지 않았으나 x축, y축의 8가지 경우의 수만 생각하고 접근해서 푸는데 시간이 오래걸렸다. 큐브는 총 x축, y축, z축까지 12가지의 경우의 수가 있다는 걸 숙지해야겠다.