728x90
문제 보기
주사위 굴리기는 시뮬레이션 문제이다.
문제 구현 순서는 아래와 같다.
1. N x M 지도에서 주사위를 이동시키면서 주사위 값의 변화를 파악
2. 지도에 있는 값과 주사위의 값을 상황에 맞게 복사
- 지도에 있는 값이 0일 때 주사위의 값을 지도로 복사한다.
- 지도에 있는 값이 0이 아닐 때 지도에 있는 값을 주사위로 복사하고 지도에 있는 값을 0으로 수정한다.
3. 주사위 윗 면에 쓰인 수 출력
[ 값의 변화 파악 ]
4가지 방향으로 주사위가 이동할 때 주사위의 값을 유지하면서 모양을 바꾸는 것이 핵심이었다.
아래는 주사위 이동에 대해서 정리한 표이다.
동 | 서 | 북 | 남 |
1 - >3 | 1 -> 4 | 1 -> 2 | 1 -> 5 |
2 -> 2 | 2 -> 2 | 2 -> 6 | 2 -> 1 |
3 -> 6 | 3 -> 1 | 3 -> 3 | 3 -> 3 |
4 -> 1 | 4 -> 6 | 4 -> 4 | 4 -> 4 |
5 -> 5 | 5 -> 5 | 5 -> 1 | 5 -> 6 |
6 -> 4 | 6 -> 3 | 6 -> 5 | 6 -> 2 |
위 표를 이용하여 아래 코드의 move 함수를 작성하였다. 또한 문제에서 주어진 x, y는 기존에 알던 열과 행이 아니라 행과 열을 나타내는 값이다. 따라서 입력을 받을 때 x, y 순서가 아닌 y, x 순서로 입력받은 후 원래 알고 있던 방식으로 구현하였다.
코드
# boj 14499
# blog: jjangsungwon.tistory.com
"""
동쪽 이동 서쪽 이동 북쪽 이동 남쪽 이동
1 -> 3 1 -> 4 1 -> 2 1 -> 5
2 -> 2 2 -> 2 2 -> 6 2 -> 1
3 -> 6 3 -> 1 3 -> 3 3 -> 3
4 -> 1 4 -> 6 4 -> 4 4 -> 4
5 -> 5 5 -> 5 5 -> 1 5 -> 6
6 -> 4 6 -> 3 6 -> 5 6 -> 2
"""
def move(n, arr): # 주사위 변화
if n == 1: # 동
return [0, arr[3], arr[2], arr[6], arr[1], arr[5], arr[4]]
elif n == 2: # 서
return [0, arr[4], arr[2], arr[1], arr[6], arr[5], arr[3]]
elif n == 3: # 북
return [0, arr[2], arr[6], arr[3], arr[4], arr[1], arr[5]]
elif n == 4: # 남
return [0, arr[5], arr[1], arr[3], arr[4], arr[6], arr[2]]
if __name__ == "__main__":
# input
N, M, y, x, K = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
order = list(map(int, input().split()))
dice = [0] * 7 # 주사위
dy = [0, 0, 0, -1, 1]
dx = [0, 1, -1, 0, 0]
# 명령 수행
for i in range(len(order)):
if y + dy[order[i]] < 0 or y + dy[order[i]] >= N or x + dx[order[i]] < 0 or x + dx[order[i]] >= M:
continue
else:
x, y = x + dx[order[i]], y + dy[order[i]] # 좌표 이동
dice = move(order[i], dice) # 주사위 이동
if arr[y][x] == 0:
arr[y][x] = dice[6] # 주사위 -> 칸
else:
dice[6] = arr[y][x] # 칸 -> 주사위
arr[y][x] = 0 # 칸에 있는 수 0으로 수정
print(dice[1])
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 18258 ] 큐2 - Python (4) | 2020.06.06 |
---|---|
[ 백준 15686 ] 치킨 배달 - Python (4) | 2020.06.05 |
[ 백준 14503 ] 로봇 청소기 - Python (2) | 2020.06.02 |
[ 백준 14502 ] 연구소 - Python (0) | 2020.06.01 |
[ 백준 1991 ] 트리 순회 - Python (0) | 2020.05.29 |