만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[python] 백준 14499번: 주사위 굴리기

D36choi 2020. 9. 16. 00:42
728x90

 

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

테마

구현, 시뮬레이션

 

예상 소요시간

3~40분

 

아이디어

 

1. 주사위 배열 3*4 를 만든다. [1,1] 이 하늘은 보는 면. [3,1] 이 땅을 보는 면이다.

0x0

xxx

0x0

0x0

2. 방향을 1: 동 / 2: 서 / 3: 북 / 4: 남으로 정해 dx,dy 를 만든다. (이동)

3. 다음좌표가 (즉 굴린 후 지도 좌표) 유효하다면 다음을 실행한다.

 

굴리기 방법

(북으로 굴림)

010

234

050

060

현 주사위의 상태라 하면 북쪽으로 굴릴 경우 [n,1] 좌표가 한칸씩 위로 밀린다.

 

030

254

060

010

남쪽은 반대 방향과 같다.

 

(동으로 굴림)

010

234

050

060

현 주사위의 상태라 하면 북쪽으로 굴릴 경우 [2,n] 좌표가 한칸씩 동쪾으로 밀린다. 그리고 [3,1] 은 [2,0]으로 밀린다.

시계방향으로 순환한다 생각하면 편하다.

 

010

623

050

040

서쪽은 반시계 방향과 같다.

 

4. 굴렸다면 [1,1] 즉, 주사위가 하늘을 보는 윗면의 값을 출력한다.

5. 굴리기가 끝나면 지도의 값이 0인지 아닌지를 확인해 [3,1] 의 좌표로 적절히 변경하고 지도도 업데이트 한다.

6. 위를 반복수행한다.

 

코드

from sys import stdin

n, m, x, y, k = map(int, stdin.readline().split())
board = [list(map(int, stdin.readline().split())) for _ in range(n)]
commands = list(map(int, stdin.readline().split()))

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


def roll(command, board, dice, now_x, now_y):
    nx = now_x + dx[command]
    ny = now_y + dy[command]
    if 0 <= nx < n and 0 <= ny < m:
        if command == 1:  # 동

            dice[1][1], dice[1][2], dice[3][1], dice[1][0] = dice[1][0], dice[1][1], dice[1][2], dice[3][1]
            print(dice[1][1])

        elif command == 2:  # 서
            dice[1][0], dice[1][1], dice[1][2], dice[3][1] = dice[1][1], dice[1][2], dice[3][1], dice[1][0]
            print(dice[1][1])

        elif command == 3:  # 북

            dice[0][1], dice[1][1], dice[2][1], dice[3][1] = dice[1][1], dice[2][1], dice[3][1], dice[0][1]
            print(dice[1][1])

        elif command == 4:  # 남
            dice[0][1], dice[1][1], dice[2][1], dice[3][1] = dice[3][1], dice[0][1], dice[1][1], dice[2][1]
            print(dice[1][1])

        if board[nx][ny] == 0:
            board[nx][ny] = dice[3][1]

        else:
            dice[3][1] = board[nx][ny]
            board[nx][ny] = 0

        return nx, ny

    else:
        return now_x, now_y


for i in range(k):
    x, y = roll(commands[i], board, dice, x, y)

 

 

다른 문제 풀려다가 너무 어려워보여서 이걸로 도망쳤다. 이 정도 문제라면 집중력만 있다면 풀 수 있다.

구현 문제니까 구현하는 법만 상상 잘하면 풀린다. 사실 말이 쉽지