[백준 #14499] 주사위 굴리기

MJ·2021년 9월 25일
0

알고리즘(PS)

목록 보기
23/30

1. 문제 설명

2. 해설

주사위 굴리는걸 시뮬레이션 해보는, 삼성 냄새가 풀풀 풍기는 문제. 주사위를 굴렸을때 각 면이 어디로 이동하는지 알아두고, 그걸 코드로 바꿔주면 된다.

  1. 주사위를 굴렸을 때 지도의 숫자가 0이 아니면 주사위의 바닥면에 숫자를 복사하고, 지도의 값은 0으로 바꿔준다
  2. 주사위를 굴렸을 때 지도의 숫자가 0이면 주사위 바닥면의 숫자를 지도에 복사한다.
  3. 지도 범위를 벗어나려고 하는 명령은 무시하고 출력도 하지 않는다. 즉, 주사위를 굴리지 않는다.

이 조건, 특히 굵게 적어놓은 조건을 유의하면서 주사위를 굴려주면 된다. 그렇다면 주사위는 어떻게 굴러갈까?

  1. 동쪽(오른쪽) : 왼쪽 -> 윗면, 윗면 -> 오른쪽, 오른쪽 -> 바닥면, 바닥면 -> 왼쪽
  2. 서쪽(왼쪽) : 윗면 -> 왼쪽, 왼쪽 -> 바닥면, 바닥면 -> 오른쪽, 오른쪽 -> 윗면
  3. 북쪽: 윗면 -> 뒷면, 뒷면 -> 바닥면, 바닥면 -> 앞면, 앞면 -> 윗면
  4. 남쪽: 윗면 -> 앞면, 앞면 -> 바닥면, 바닥면 -> 뒷면, 뒷면 -> 윗면

이렇게 굴러간다고 머릿속으로 그려보고 이해하자. 여기서 동서쪽으로 굴릴 때는 앞뒷면이 변하지 않고, 남북으로 굴릴 때는 좌우면이 바뀌지 않는다는 것도 이해했다고 믿는다. 그럼 이제 코드를 짜 보자.

3. 코드

from sys import stdin
input = stdin.readline

N, M, x, y, K = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]

# 0: 위, 1: 아래, 2: 앞, 3: 뒤, 4: 왼, 5: 오
dice = [0, 0, 0, 0, 0, 0]

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

for order in order_list:
    if order == 1:  # 동: 위->오, 오->아래, 아래->왼, 왼->위
        if y+1 >= M:
            continue
        else:
            up = dice[0]
            down = dice[1]
            left = dice[4]
            right = dice[5]

            dice[0] = left
            dice[1] = right
            dice[4] = down
            dice[5] = up

            y += 1

    elif order == 2:  # 서: 오른쪽->위, 위->왼쪽, 왼쪽->아래, 아래->오른쪽
        if y-1 < 0:
            continue
        else:
            up = dice[0]
            down = dice[1]
            left = dice[4]
            right = dice[5]

            dice[0] = right
            dice[1] = left
            dice[4] = up
            dice[5] = down

            y -= 1

    elif order == 3:  # 북 - 앞->위, 위->뒤, 뒤->아래, 아래->앞
        if x-1 < 0:
            continue
        else:
            up = dice[0]
            down = dice[1]
            front = dice[2]
            rear = dice[3]

            dice[0] = front
            dice[1] = rear
            dice[2] = down
            dice[3] = up

            x -= 1

    elif order == 4:  # 남 - 위->앞, 앞->아래, 아래->뒤, 뒤->위
        if x+1 >= N:
            continue
        else:
            up = dice[0]
            down = dice[1]
            front = dice[2]
            rear = dice[3]

            dice[0] = rear
            dice[1] = front
            dice[2] = up
            dice[3] = down

            x += 1

    if graph[x][y] != 0:
        dice[1] = graph[x][y]
        graph[x][y] = 0
    else:
        graph[x][y] = dice[1]

    print(dice[0])
profile
오늘보다 내일을 더 즐겁게

0개의 댓글