chldkato

백준 14499 주사위 굴리기 (파이썬) 본문

백준

백준 14499 주사위 굴리기 (파이썬)

chldkato 2020. 4. 19. 15:11

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

문제에 나와있는대로 인덱스를 정한 리스트를 만들어서 시뮬레이션한다

dx, dy 이동방향 순서: 동 서 북 남

dice 주사위 순서: 위 북 동 서 남 아래

 

1. 리스트 order에는 굴릴 방향을 순서대로 입력하고 리스트 dice는 0으로 초기화한다

2. 명령을 하나씩 불러와서 주사위를 굴린다

   범위를 벗어나면 continue해서 아무행동도 하지않는다

3. dice의 인덱스와 방향을 잘 고려해서 굴린방향에 맞춰 dice를 갱신한다

4. 현재 칸이 0이면 주사위 아랫면의 숫자로 바꿔준다

   0이 아니면 칸의 숫자를 주사위 아랫면으로 옮겨오고 칸의 숫자를 0으로 바꿔준다

5. 주사위 윗칸의 숫자를 출력한다

import sys

input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]


n, m, x, y, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
order = list(map(int, input().split()))
dice = [0 for _ in range(6)]

for i in range(k):
    dir = order[i] - 1
    nx = x + dx[dir]
    ny = y + dy[dir]
    if not 0 <= nx < n or not 0 <= ny < m:
        continue

    if dir == 0:
        dice[0], dice[2], dice[3], dice[5] = dice[3], dice[0], dice[5], dice[2]
    elif dir == 1:
        dice[0], dice[2], dice[3], dice[5] = dice[2], dice[5], dice[0], dice[3]
    elif dir == 2:
        dice[0], dice[1], dice[4], dice[5] = dice[4], dice[0], dice[5], dice[1]
    else:
        dice[0], dice[1], dice[4], dice[5] = dice[1], dice[5], dice[0], dice[4]

    if a[nx][ny] == 0:
        a[nx][ny] = dice[5]
    else:
        dice[5] = a[nx][ny]
        a[nx][ny] = 0

    x, y = nx, ny
    print(dice[0])

'백준' 카테고리의 다른 글

백준 3190 뱀 (파이썬)  (0) 2020.04.19
백준 13458 시험 감독 (파이썬)  (0) 2020.04.19
백준 14500 테트로미노 (파이썬)  (0) 2020.04.19
백준 14501 퇴사 (파이썬)  (0) 2020.04.18
백준 14503 로봇 청소기 (파이썬)  (0) 2020.04.17
Comments