백준 문제풀이
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) / 주사위는 (위->남 / 밑->북 / 동->동 / 서->서 / 남->밑 / 북->위)