728x90
https://www.acmicpc.net/problem/5373
총 구해야하는 회전의 경우의 수는 12개(각 면 6개와 시계/반시계방향)
필요한 경우의 수에 대한 모든 함수를 구현하지 않아도,
마주보는 면을 한 쌍으로 규칙을 찾으면 같은 함수로 처리할 수가 있다
(ex: 윗면의 시계방향과 아랫면의 반시계방향은 인덱스만 다를 뿐 돌아가는 나머지4면의 종류와 방향이 동일하다)
아래 큐브 맞추기 사이트를 참고하여 디버깅을 하며 문제풀이를 진행하였다.
각 면마다 0,0과 2,2인덱스가 될 부분이 어딘지 잘 정해주고 그에 따라 배열을 회전했을 때 어떻게 되는지만 잘 분기해주면 된다.
https://rubiks-cube-solver.com/ko/
루빅 큐브 맞추기
온라인 루빅 큐브 맞추기는 뒤섞인 루빅 큐브를 푸는데 필요한 계산을 합니다. 귀하의 뒤섞인 퍼즐의 색깔을 입력하고 풀기 버튼을 눌러주세요. 그 다음 프로그램에 의해 제공된 지시를 따라 주
rubiks-cube-solver.com
다만 길을 잃었을 경우 어디서 틀렸는지 중간에 찾아내는게 넘 복잡하고 어려웠다ㅜ
top, front, bottom, left, right, back = [
[[c]*3 for _ in range(3)]
for c in ('w','r','y','g','b','o')
]
def rotation(arr, face, clockwise):
tmp = [row[:] for row in arr]
cw = (clockwise == '+')
if face not in ('F', 'R', 'U'):
cw = not cw
for i in range(3):
for j in range(3):
if cw:
arr[j][2-i] = tmp[i][j]
else:
arr[2-j][i] = tmp[i][j]
def UD(cmd, clockwise):
tmp = [row[:] for row in front]
row = 0 if cmd == 'U' else 2
if (clockwise == '-' and cmd == 'D') or (clockwise == '+' and cmd == 'U'):
for i in range(3):
front[row][i] = right[row][i]
right[row][i] = back[row][(2-i)%3]
back[row][(2-i)%3] = left[row][(2-i)%3]
left[row][(2-i)%3] = tmp[row][i]
else:
for i in range(3):
front[row][i] = left[row][(2-i)%3]
left[row][(2-i)%3] = back[row][(2-i)%3]
back[row][(2-i)%3] = right[row][i]
right[row][i] = tmp[row][i]
rotation(top if cmd == 'U' else bottom, cmd, clockwise)
def LR(cmd, clockwise):
tmp = [row[:] for row in front]
col = 0 if cmd == 'L' else 2
if (clockwise == '-' and cmd == 'L') or (clockwise == '+' and cmd == 'R'):
for i in range(3):
front[i][col] = bottom[(2-i)%3][col]
bottom[(2-i)%3][col] = back[(2-i)%3][col]
back[(2-i)%3][col] = top[i][col]
top[i][col] = tmp[i][col]
else:
for i in range(3):
front[i][col] = top[i][col]
top[i][col] = back[(2-i)%3][col]
back[(2-i)%3][col] = bottom[(2-i)%3][col]
bottom[(2-i)%3][col] = tmp[i][col]
rotation(left if cmd == 'L' else right, cmd, clockwise)
def FB(cmd, clockwise):
tmp = [row[:] for row in top]
row = 0 if cmd == 'B' else 2
col = 2 if cmd == 'F' else 0
if (clockwise == '-' and cmd == 'F') or (clockwise == '+' and cmd == 'B'):
for i in range(3):
top[row][i] = right[i][(2-col)%3]
right[i][(2-col)%3] = bottom[row][(2-i)%3]
bottom[row][(2-i)%3] = left[(2-i)%3][(2-col)%3]
left[(2-i)%3][(2-col)%3] = tmp[row][i]
else:
for i in range(3):
top[row][i] = left[(2-i)%3][(2-col)%3]
left[(2-i)%3][(2-col)%3] = bottom[row][(2-i)%3]
bottom[row][(2-i)%3] = right[i][(2-col)%3]
right[i][(2-col)%3] = tmp[row][i]
rotation(back if cmd == 'B' else front, cmd, clockwise)
n = int(input())
for tc in range(n):
rotate = int(input())
commands = input().split()
top, front, bottom, left, right, back = [
[[c]*3 for _ in range(3)]
for c in ('w','r','y','g','b','o')
]
for command in commands:
if command[0] == 'U' or command[0] == 'D':
UD(command[0], command[1])
elif command[0] == 'F' or command[0] == 'B':
FB(command[0], command[1])
else:
LR(command[0], command[1])
for row in top:
print(*row, sep="")
그나저나 자바로 구현문제 풀다가 파이썬으로 푸니까 진짜 신세계다 너무 편함
728x90
'알고리즘 > 문제풀이' 카테고리의 다른 글
| 백준9527: 1의 개수 세기(Java, Python) (0) | 2026.02.12 |
|---|---|
| 백준6593: 상범 빌딩(Java) (0) | 2024.03.13 |
| 백준9934 - 완전 이진 트리(Java) (1) | 2024.03.01 |
| 백준12919 : A와 B 2 (0) | 2024.02.27 |
| 백준9184: 신나는 함수 실행(Java) (0) | 2024.02.27 |