ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14499) 주사위 굴리기 (골드.4)
    알고리즘/백준 2022. 7. 13. 22:56

     

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

     

    14499번: 주사위 굴리기

    첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

    www.acmicpc.net

     

     

    단순 구현의 문제라고 생각하고 문제에 주어진 주사위 모양을 참고하여 구현하였다. 

    조건을 확인하면 다음과 같다. 

    1) 이동 방향이 동서북남

    2) 지도상 좌표의 숫자가 0일 경우 이동한 주사위의 밑면의 숫자를 복사할 것 

    3) 지도상 좌표의 숫자가 0이 아닐 경우 주사위 밑면에 지도상의 숫자를 복사하고 지도상 좌표의 수는 0으로 만들 것 

     

    구현하고 나서 계속해서 예제 4번에서 틀린 답이 나왔는데 지도상 좌표의 숫자가 0일 경우 이동한 주사위의 밑면 숫자를 복사하고 주사위 밑면의 숫자는 건들지 않아야 한다는 것을 자세히 보지 못해서 틀렸다. ( 문제를 잘 읽고 주사위 숫자를 0으로 바꾸지 않도록 하자!)

     

    처음 구현한 코드는 다음과 같다. 

    from collections import deque
    n, m, y, x, k = map(int, input().split())
    board = [[] for _ in range(n)]
    for i in range(n):
        num = list(map(int, input().split()))
        board[i].extend(num)
    directions = list(map(int, input().split()))
    # 동서북남 방향 
    d = [(0, 1), (0, -1), (-1, 0), (1, 0)]
    global dice_row, dice_column
    dice_row = deque([0, 0, 0])
    dice_column = deque([0, 0, 0, 0])
    
    def roll_dice(direction, num):
        global dice_row, dice_column
        if direction == 1 : 
            upper = dice_column.pop()
            dice_column.append(dice_row.popleft())
            dice_row.append(upper)
            dice_column[1] = dice_row[1]
        elif direction == 2:
            upper = dice_column.pop()
            dice_column.append(dice_row.pop())
            dice_row.appendleft(upper)
            dice_column[1] = dice_row[1]
        elif direction == 3:
            dice_column.appendleft(dice_column.pop())
            dice_row[1] = dice_column[1]
        elif direction == 4 : 
            dice_column.append(dice_column.popleft())
            dice_row[1] = dice_column[1]
        bottom = dice_column[1]
        if num != 0  : 
            dice_column[1] = num
            dice_row[1] = num 
        return bottom 
    
    for direction in directions:
        ny = y + d[direction-1][0]
        nx = x + d[direction-1][1]
        if nx<0 or m<=nx or ny<0 or n<=ny :
            continue 
        y, x = ny, nx 
        if board[y][x] == 0 :
            board[y][x] = roll_dice(direction, board[y][x])
        else : 
            roll_dice(direction, board[y][x])
            board[y][x] = 0
        print(dice_column[3])

    주사위 모양을 문제의 내용을 참고하여 가로 세로 따로따로 구현하고자 하다보니 deque가 두개가 나오게 되었다. 

    정답을 통과하고 다른 사람의 답변을 보니 다음과 같이 간단한 식으로도 구현이 가능하였다. 😭

     

     

     

    n, m, y, x, k = map(int, input().split())
    board = [[] for _ in range(n)]
    for i in range(n):
        num = list(map(int, input().split()))
        board[i].extend(num)
    directions = list(map(int, input().split()))
    # 동서북남 방향 
    d = [(0, 1), (0, -1), (-1, 0), (1, 0)]
    global dice
    # 왼, 오, 앞, 뒤, 상, 하 
    dice = [0, 0, 0, 0, 0, 0]
    
    def roll_dice(direction, num):
        global dice
        a, b, c, d, e, f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
        # 동 
        if direction == 1 : 
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, f, c, d, b, a
        elif direction == 2:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = f, e, c, d, a, b
        elif direction == 3:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = a, b, e, f, d, c
        elif direction == 4 : 
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = a, b, f, e, c, d
        bottom = dice[4]
        if num != 0  : 
            dice[4] = num 
        return bottom 
    
    for direction in directions:
        ny = y + d[direction-1][0]
        nx = x + d[direction-1][1]
        if nx<0 or m<=nx or ny<0 or n<=ny :
            continue 
        y, x = ny, nx 
        if board[y][x] == 0 :
            board[y][x] = roll_dice(direction, board[y][x])
        else : 
            roll_dice(direction, board[y][x])
            board[y][x] = 0
        print(dice[5])

    주사위 배열을 만들고 면마다 인덱스를 이용해서 면을 이동시키도록 한다. 

     

    다행히 메모리 상의 큰 차이는 없었다!

Designed by Tistory.