chldkato

백준 23288 주사위 굴리기 2 (파이썬) 본문

백준

백준 23288 주사위 굴리기 2 (파이썬)

chldkato 2021. 11. 6. 15:37

https://www.acmicpc.net/problem/23288

 

23288번: 주사위 굴리기 2

크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼

www.acmicpc.net

1. dx, dy는 동남서북 순으로 이동하도록 만든다

2. 1~6 을 갖는 주사위 리스트 dice를 만든다

3. 문제 조건대로 이동을 시작한다

   이동 방향 변수인 dir은 동쪽에 해당하는 0을 초기값으로 한다.

4. 만약 다음칸이 이동 가능한 범위를 벗어나면, dir을 (dir + 2) % 4로 반대 방향으로 바꿔준다

5. bfs로 연속으로 이동할 수 있는만큼 이동하고, 이동한 칸을 cnt로 return 한다

6. 최종 출력이 되는 ans에 (bfs 출력값 + 1) * 현재 좌표 값을 더해준다. (맨 처음칸을 포함해야해서 bfs + 1)

7. 이동 방향에 맞춰서 주사위 값을 바꿔준다

8. 주사위 아랫면과 해당 칸의 값을 비교해서 조건대로 방향을 바꿔준다.

import sys
from collections import deque

input = sys.stdin.readline
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]


def bfs(x, y, k):
    c[x][y] = 1
    q.append([x, y])
    cnt = 0
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if c[nx][ny] == 0 and a[nx][ny] == k:
                    cnt += 1
                    c[nx][ny] = 1
                    q.append([nx, ny])
    return cnt


n, m, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
dice = [1, 2, 3, 4, 5, 6]

x, y, dir, ans = 0, 0, 0, 0
for _ in range(k):
    if not 0 <= x + dx[dir] < n or not 0 <= y + dy[dir] < m:
        dir = (dir + 2) % 4

    x, y = x + dx[dir], y + dy[dir]

    q = deque()
    c = [[0] * m for _ in range(n)]

    ans += (bfs(x, y, a[x][y]) + 1) * a[x][y]

    if dir == 0:
        dice[0], dice[2], dice[3], dice[5] = dice[3], dice[0], dice[5], dice[2]
    elif dir == 1:
        dice[0], dice[1], dice[4], dice[5] = dice[1], dice[5], dice[0], dice[4]
    elif dir == 2:
        dice[0], dice[2], dice[3], dice[5] = dice[2], dice[5], dice[0], dice[3]
    else:
        dice[0], dice[1], dice[4], dice[5] = dice[4], dice[0], dice[5], dice[1]

    if dice[5] > a[x][y]:
        dir = (dir + 1) % 4
    elif dice[5] < a[x][y]:
        dir = (dir + 3) % 4

print(ans)

Comments