알고리즘/문제풀이

[백준] 14499번 주사위 굴리기 - 파이썬(Python)

SeongOnion 2021. 10. 14. 10:29
728x90

문제 (링크)

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

 

나의 풀이

import sys
input = sys.stdin.readline

n, m, x, y, k = map(int, input().split())
graph = []
# 동: 1 서: 2 북: 3 남: 4
moves = [
    [],
    [0, 1],
    [0, -1],
    [-1, 0],
    [1, 0]
]

# 아래부터 0, 1, 2, 3, 왼쪽 4, 오른쪽 5
# 주사위의 맨 위: dice[0], 맨 아래: dice[2]
dice = [0] * 6

# 주사위 굴리기
def roll_dice(direction):
    if direction == 1:
        dice[0], dice[2], dice[4], dice[5] = dice[4], dice[5], dice[2], dice[0]
    elif direction == 2:
        dice[0], dice[2], dice[4], dice[5] = dice[5], dice[4], dice[0], dice[2]
    elif direction == 3:
        dice[0], dice[1], dice[2], dice[3] = dice[3], dice[0], dice[1], dice[2]
    else: # direction == 4
        dice[0], dice[1], dice[2], dice[3] = dice[1], dice[2], dice[3], dice[0]

for _ in range(n):
    graph.append(list(map(int, input().split())))

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

for command in commands:
    if 0 <= x + moves[command][0] < n and 0 <= y + moves[command][1] < m:
        x, y = x + moves[command][0], y + moves[command][1]
        roll_dice(command)

        if graph[x][y] == 0:
            graph[x][y] = dice[2]
        
        else:
            dice[2] = graph[x][y]
            graph[x][y] = 0
        
        print(dice[0])

코드 설명 및 풀이법

최근 풀었던 구현 문제 중 그나마 난이도가 좀 쉬운 문제였다.

 

주사위를 굴리는 작업만 잘 처리해주면 큰 문제가 없다.

 

주사위는 크기가 6짜리 배열을 만들고 그곳에 정보를 저장해주었다.

 

주사위의 인덱스를 다음과 같이 해서 동, 서, 남, 북으로 굴렸을 때 바뀌는 위치 값을 갱신해줬다.

 

다른 언어였으면 스와핑하는 과정이 그리 간단하지는 않았겠지만 파이썬은 역시 이런 부분에서 참 편한 것 같다.

 

주사위를 굴리는 것만 잘 된다면 나머지는 문제에 나와있는대로 잘 구현해주면 된다.