백준5373: 큐빙(Python)

2026. 2. 16. 17:12·알고리즘/문제풀이
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
'알고리즘/문제풀이' 카테고리의 다른 글
  • 백준9527: 1의 개수 세기(Java, Python)
  • 백준6593: 상범 빌딩(Java)
  • 백준9934 - 완전 이진 트리(Java)
  • 백준12919 : A와 B 2
kkap999
kkap999
IT에 관심 가득한 갑갑이의 개발&스터디 블로그 태클 언제나 환영합니다
  • kkap999
    갑갑이의 개발세상
    kkap999
    • 분류 전체보기 (105)
      • Backend (9)
        • Java&Spring&Servlet (8)
        • DB (0)
      • 알고리즘 (81)
        • 문제풀이 (72)
        • 자료구조 (7)
        • 그 외 (2)
      • AI (4)
      • Computer Science (3)
        • 네트워크 (2)
        • 컴퓨터기초 (0)
        • 리눅스마스터 (1)
      • App&FE (3)
        • FE (1)
        • Flutter (2)
      • 독서 (1)
      • 잡담&일상 (3)
        • 일상 (1)
        • 잡담 (2)
        • 음악 (0)
  • 태그

    백준
    N과M(1)
    BOJ
    알고리즘
    BOJ15649
  • 링크

    • github
  • 인기 글

  • 최근 글

  • 03-25 18:59
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
kkap999
백준5373: 큐빙(Python)
상단으로

티스토리툴바