백준 문제풀이

14499번: 주사위 굴리기 / gold 4 / 구현, 시뮬레이션

RonLee 2023. 5. 6. 13:36

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

'''
14499번: 주사위 굴리기 / gold 4 / 구현, 시뮬레이션
'''
import sys

input = sys.stdin.readline

# 입력 받기
N, M, x, y, K = map(int, input().split())
graph = []
for _ in range(N):
    graph.append(list(map(int, input().split())))
command = list(map(int, input().split()))
# 주사위 [위, 아래, 동, 서, 남, 북]
dice = [0 for _ in range(6)]
# 명령어 (1,2,3,4) -> (x,y) 좌표 이동
dir = [[], [0, 1], [0, -1], [-1, 0], [1, 0]]
# 명령어 (1,2,3,4) -> 주사위 위치 변경
dice_dir = [[], [2, 3, 1, 0, 4, 5], [3, 2, 0, 1, 4, 5], [5, 4, 2, 3, 0, 1],
            [4, 5, 2, 3, 1, 0]]
# 명령어 하나씩 실행하기
for c in command:
    # 좌표 이동 확인
    if 0 <= x + dir[c][0] < N and 0 <= y + dir[c][1] < M:
        # 좌표 이동하기
        x += dir[c][0]
        y += dir[c][1]
        # 주사위 이동하기
        tmp = [0 for _ in range(6)]
        for i in range(6):
            tmp[i] = dice[dice_dir[c][i]]
        dice = tmp
        # 지도 칸 확인하기 / 0일 때, 0이 아닐 때
        if graph[x][y] == 0:
            graph[x][y] = dice[1]
        else:
            dice[1] = graph[x][y]
            graph[x][y] = 0
        # 현재 주사위 윗면 출력
        print(dice[0])

코드 리뷰

- 문제 풀이 시간은 약 70분이 소요되었고, 혼자 힘으로 정답 판정을 받았습니다.

- 문제를 이해하는데 시간이 많이 소요되었습니다. 

 

문제 이해하기

- 제가 생각하기에 문제 설명이 너무 헷갈리게 되어 있어서, 예제를 보면서 시뮬레이션을 하다보니 감을 잡았습니다.
- 명령어 (동,서,남,북) 하나가 실행 되면, 현재 주사위가 움직이는 시뮬레이션을 구현해야 합니다.

- 주사위가 움직인다는 의미는, 주사위 위치가 명령어 (동,서,남,북)에 따라 한번 굴려진다는 의미입니다!

- 명령어 방향에 따라 -> 주사위 위치 ( x, y ) 이동 + 주사위 면 (위,아래,동,서,남,북) 갱신  

Ex) 명령어가 4(남쪽) 일 때 && 주사위 위치 x, y 좌표가 (0,0) 일 때 

   => x, y 은 (1, 0) / 주사위는 (위->남 / 밑->북 / 동->동 / 서->서 / 남->밑 / 북->위)