본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 14499.주사위 굴리기

by 안녕나는현서 2022. 3. 5.
728x90

📌 문제

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

 

📌 문제 접근 방법

  1. 입력값을 모두 받은 뒤, 방향을 옮기기 위해 dxy를 만들었다. 인덱스를 4로 나눈 나머지를 쓰려고 남-동-서-북 순서로 리스트에 넣었다.
  2. dise에는 전개도에 그려진 번호대로 해당 번호에 적힌 숫자를 저장했다.
    다만 리스트의 인덱스는 0부터 시작하므로 전개도의 번호에서 1을 뺀 인덱스에 저장된다고 생각하면 된다.
  3. 명령에 따라 주사위를 이동시킨다. 주사위가 범위를 벗어나지 않으면 x, y를 nx, ny로 갱신하고 벗어난다면 continue를 통해 다음 명령으로 넘어가도록 한다.
  4. 주사위를 이동시킨 후 바닥면을 갱신한다. 이건 직접 전개도를 그려보면서 동서남북 방향으로 어떻게 바뀌는지 체크해서 swap하였다.
  5. 주사위가 이동한 위치의 값에 따라 주사위 또는 지도의 값을 갱신하고 상단에 쓰여 있는 값을 출력한다.

 

📌 코드

# 백준 14499 주사위 굴리기

N, M, x, y, K = map(int, input().split())

grid = []
for _ in range(N):
    grid.append(list(map(int, input().split())))

cmd = list(map(int, input().split()))
dxy = [(1, 0), (0, 1), (0, -1), (-1, 0)] # 남(4) 동(1) 서(2) 북(3)

dise = [0 for _ in range(6)] # 바닥면 인덱스 : 5

for c in cmd:
    # 맵에서 주사위 이동
    dx, dy = dxy[c%4]
    nx, ny = x+dx, y+dy
    if 0 <= nx < N and 0 <= ny < M:
        x, y = nx, ny
    else:
        continue

    # 바닥면 갱신
    if c == 1: # 동
        dise[0], dise[5], dise[3], dise[2] = dise[3], dise[2], dise[5], dise[0]
    elif c == 2: # 서
        dise[0], dise[5], dise[3], dise[2] = dise[2], dise[3], dise[0], dise[5]
    elif c == 3: # 북
        dise[1], dise[0], dise[4], dise[5] = dise[0], dise[4], dise[5], dise[1]
    elif c == 4: # 남
        dise[1], dise[0], dise[4], dise[5] = dise[5], dise[1], dise[0], dise[4]

    if grid[x][y]:
        dise[5] = grid[x][y]
        grid[x][y] = 0
    else:
        grid[x][y] = dise[5]

    print(dise[0])
728x90

댓글