[백준 삼성기출 X] 주사위 굴리기(python)

이진규·2022년 8월 2일
1

백준(PYTHON)

목록 보기
63/115

문제

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

나의 코드

"""

"""

from sys import stdin
input = stdin.readline

n, m, x, y, k = map(int, input().split())
pan = [ list(map(int, input().split())) for _ in range(n) ]
direction = list(map(int, input().split())) # 동쪽 : 1, 서쪽 : 2, 북쪽 : 3, 남쪽 : 4
dice = [0] * 6 # 위쪽 : 0, 옆면(앞) : 1, 옆면(동) : 2, 옆면(뒤) : 3, 옆면(서) : 4, 밑면 : 5

mx, my = x, y # 지도에서 다음 위치
dx, dy = [0, 0, -1, 1], [1, -1, 0, 0] # 동, 서, 북, 남
for dir in direction:

    # 지도에서의 다음 좌표 갱신
    mx = x + dx[dir-1]
    my = y + dy[dir-1]

    # 만약 범위를 벗어 나는 경우 좌표를 원 위치 하고 다음 반복문으로 넘어감.
    if not (0 <= mx < n and 0 <= my < m):
        mx = x
        my = y
        continue

    # 만약 위에서 지도의 범위를 벗어나지 않는다면 주사위도 마찬가지로 동,서,북,남에 따른 값을 바꿔줌.
    if dir == 1: # 동쪽
        dice[0], dice[2], dice[4], dice[5] = dice[4], dice[0], dice[5], dice[2]
    elif dir == 2: # 서쪽
        dice[0], dice[2], dice[4], dice[5] = dice[2], dice[5], dice[0], dice[4]
    elif dir == 3: # 북쪽
        dice[0], dice[1], dice[3], dice[5] = dice[1], dice[5], dice[0], dice[3]
    elif dir == 4: # 남쪽
        dice[0], dice[1], dice[3], dice[5] = dice[3], dice[0], dice[5], dice[1]

    # 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
    # 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
    if pan[mx][my] == 0:
        pan[mx][my] = dice[5]
    elif pan[mx][my] != 0:
        dice[5] = pan[mx][my]
        pan[mx][my] = 0

    # 좌표를 업데이트 해줌.
    x, y = mx, my

    # 주사위 제일 윗면을 출력한다.
    print(dice[0])
    

설명

주사위를 굴리는 부분을 처음에 4*3 배열로 만들었다가 헷갈려서 코드 작성을 제대로 하지못함.

주사위는 6면이니 크기가 6인 1차원 배열을 생성한 후 각 인덱스에 따른 주사위의 윗면, 옆면, 밑면을 정해주고 업데이트 해주면 된다. 자세한 그림과 설명은 참고자료에 있음!

참고 자료

https://hongcoding.tistory.com/128

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글