이숭간 공부기록

[백준] 14499번 파이썬 _ 주사위굴리기 (삼성SW) 본문

알고리즘/백준

[백준] 14499번 파이썬 _ 주사위굴리기 (삼성SW)

이숭간 2021. 8. 12. 17:45
728x90

https://www.acmicpc.net/problem/status/14499/28/1

문제유형 : 구현

 

문제풀이

  • 이동시에 주사위를 바꿔주는것을 구현할 수 있어야한다.
  • 동서남북에 따라 좌표이동을 생각해서 미리 구현해놓으면 된다. 다른분들의 풀이도 수동으로 동서남북에 좌표변환을 지정해두었다.

 

두번째 푸는 문젠데 첫번째때는 아마 못풀어서 답을 보고 풀었던 기억이 있는데 이번에는 바로 풀었다. 실력이 조금씩 늘긴 하나보다! 더 화이팅!

 

정답코드 :

import sys
input = sys.stdin.readline

graph = []

n, m, x, y, k = map(int, input().split())
for i in range(n):
    graph.append(list(map(int, input().split())))

order = list(map(int, input().split()))

# 1,2,3,4 - 동서북남 - 우좌상하
dx = [0, 0, 0, -1, 1]
dy = [0, 1, -1, 0, 0]

dice = [[0] * 3 for _ in range(4)]

def move_south(dice):
    new_dice = [[0] * 3 for _ in range(4)]

    new_dice[0][1] = dice[3][1]
    new_dice[1][1] = dice[0][1]
    new_dice[2][1] = dice[1][1]
    new_dice[3][1] = dice[2][1]
    new_dice[1][0] = dice[1][0]
    new_dice[1][2] = dice[1][2]

    return new_dice


def move_north(dice):
    new_dice = [[0] * 3 for _ in range(4)]

    new_dice[0][1] = dice[1][1]
    new_dice[1][1] = dice[2][1]
    new_dice[2][1] = dice[3][1]
    new_dice[3][1] = dice[0][1]
    new_dice[1][0] = dice[1][0]
    new_dice[1][2] = dice[1][2]

    return new_dice


def move_west(dice):
    new_dice = [[0] * 3 for _ in range(4)]

    new_dice[0][1] = dice[0][1]
    new_dice[2][1] = dice[2][1]
    new_dice[3][1] = dice[1][0]
    new_dice[1][0] = dice[1][1]
    new_dice[1][2] = dice[3][1]
    new_dice[1][1] = dice[1][2]

    return new_dice


def move_east(dice):
    new_dice = [[0] * 3 for _ in range(4)]

    new_dice[0][1] = dice[0][1]
    new_dice[2][1] = dice[2][1]
    new_dice[1][1] = dice[1][0]
    new_dice[1][2] = dice[1][1]
    new_dice[1][0] = dice[3][1]
    new_dice[3][1] = dice[1][2]

    return new_dice


# 명령의 개수
for i in range(k):
    j = order[i]
    # 시작점에서 움직인 좌표
    moved_x, moved_y = x + dx[j], y + dy[j]
    # print(moved_x, moved_y)
    # 그래프를 벗어나지 않으면
    if 0 <= moved_x < n and 0 <= moved_y < m:
        # 주사위를 굴린다.
        if j == 1:
            dice = move_east(dice)
        elif j == 2:
            dice = move_west(dice)
        elif j == 3:
            dice = move_north(dice)
        else:
            dice = move_south(dice)
        # 주사위의 바닥과 그래프의 바닥을 비교한다.
        # 바닥이 0이면 주사위의 바닥을 칸에 복사한다.
        # 바닥이 0이 아니면 주사위의 바닥을 교체한다.
        if graph[moved_x][moved_y] == 0:
            graph[moved_x][moved_y] = dice[3][1]
        else:
            dice[3][1] = graph[moved_x][moved_y]
            graph[moved_x][moved_y] = 0

        x, y = moved_x, moved_y

        print(dice[1][1])