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
문제 요약
지도의 크기 (n,m)
주사위가 놓여져 있는 위치 (x,y) - 모든 면에 0
- 지도=0: 주사위의 바닥면의 숫자가 지도에 복사
- 지도!=0 : 지도의 숫자가 주사위의 바닥면으로 복사
주사위를 놓은 곳의 좌표, 이동시키는 명령(k개)
동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
주사위 이동했을 때마다 상단에 쓰여 있는 값 출력)
* 주사위는 지도 바깥으로 나갈 수 x, 출력도 x
문제 풀이
# 방향에 따라 이동했을 경우 주사위 방향
# 기본 주사위 (1,2,3,4,5,6) -> 동쪽 이동 (4,2,1,6,5,3)
def turn(dir):
a, b, c, d, e, f = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if dir == 0: #동
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d, b, a, f, e, c
elif dir == 1: #서
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = c, b, f, a, e, d
elif dir == 2: #북
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, a, c, d, f, b
else: # 남
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = b, f, c, d, a, e
# 입력 받기
n,m,x,y,k = map(int, input().split())
graph = []
for _ in range(n):
graph.append(list(map(int, input().split())))
orders = list(map(int, input().split()))
dice = [0]*6
dx = [0,0,-1,1]
dy = [1,-1,0,0]
nx, ny = x, y
for i in orders:
i -= 1
nx += dx[i]
ny += dy[i]
# 지도 밖으로 나갈 경우
if nx<0 or ny<0 or nx>=n or ny>=m:
nx -= dx[i]
ny -= dy[i]
continue
turn(i)
if graph[nx][ny] == 0:
graph[nx][ny] = dice[-1]
else:
dice[5] = graph[nx][ny]
graph[nx][ny] = 0
print(dice[0])
for문에서 입력 받은 명령어에 -1을 해줬으므로 이를 유의해야한다.
'CODING TEST > ALGORITHM - 문제' 카테고리의 다른 글
[프로그래머스] 무인도 여행 - Python (0) | 2023.02.04 |
---|---|
[프로그래머스/2020 KAKAO BLIND RECRUITMENT] 괄호 변환 - Python (0) | 2023.02.04 |
[프로그래머스/Summer/Winter Coding(~2018)] 영어 끝말잇기 - Python (0) | 2023.01.22 |
[백준 : 14891] 톱니바퀴 - Python (0) | 2023.01.16 |
[카카오 인턴십/프로그래머스] 수식 최대화 - Python (0) | 2023.01.13 |