깡뇽

[백준] 14499번 주사위 굴리기 파이썬 본문

Algorithm/BAEKJOON

[백준] 14499번 주사위 굴리기 파이썬

깡뇽 2022. 10. 11. 01:48
반응형

NxM 크기 지도

오른쪽 : 동쪽, 위쪽 : 북쪽

지도의 좌표 (r, c) : r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수

주사위는 지도 (x, y)위치에 놓여있으며, 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태.

가장 처음 주사위 모든 면에 0이 적혀져 있음.

주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.

 

- 입력

1줄 : 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20) , 주사위를 놓을 곳의 좌표 x, y (0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1) , 명령의 개수 K (1 ≤ K ≤ 1,000)

2~N줄 : 지도에 쓰여 있는 수(북->남/서->동/주사위를 놓은 칸에 쓰인 수 == 0)

마지막줄 : 이동하는 명령(동쪽: 1, 서쪽: 2, 북쪽: 3, 남쪽: 4)

 

- 출력

이동할 때마다 주사위의 윗 면에 쓰여 있는 수

(바깥으로 이동하는 경우, 해당 명령을 무시하고 출력X)

 

14499번 주사위 굴리기

n, m, x, y, k = map(int, input().split())

numbers = [list(map(int, input().split())) for _ in range(n)]
order = list(map(int, input().split()))
dice = [0 for _ in range(6)]

dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def turn(direction):
    zero, one, two, three, four, five = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
    if direction == 1: #동
        dice[0], dice[2], dice[3] = three, zero, two
    if direction == 2: #서
        dice[0], dice[2], dice[3] = two, three, zero
    if direction == 3: #북
        dice[0], dice[1], dice[4], dice[5] = four, zero, five, one
    if direction == 4: #남
        dice[0], dice[1], dice[4], dice[5] = two, five, zero, four
  
for dir in order:  
    nx = x + dx[dir-1]
    ny = y + dy[dir-1]
    
    if 0 > nx >= n or 0 > ny >= m:
      continue

    x, y = nx, ny
    turn(dir)
  
    if numbers[x][y] == 0:
        numbers[x][y] = dice[5]
    else:
        dice[5] = numbers[x][y]
        numbers[x][y] = 0

    print(dice[0])

 

turn 함수를 통해 동, 서, 남, 북에 따라 주사위의 값을 변경한다. 주사위에 따른 이동은 order리스트에 있는 방향 정보들을 하나씩 꺼내고 nx와 ny 변화로 구현할 수 있다. 다만 1~4의 값이므로 -1을 해주어 0~3으로 활용한다. (원래라면 for i in range(4): nx = nx + dx[i] 같은 식으로 사용했을텐데) 전체 크기 NxM을 벗어나면 continue를 시키고, 벗어나지 않는 경우에만 회전을 시켜서 해당 값이 0일 경우에는 주사위의 바닥 값을 numbers에 넣는다. 그렇지 않을 떄에는 주사위 바닥에 numbers 값을 넣고 numbers는 0으로 만든다. 

=> 그런데 코드에서 무언가 잘못되어서 에러가 난다.. 흠

 

 

 

 

 

 

 

 

출처 : 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

 

반응형