23288: 주사위 굴리기 2

ewillwin·2023년 9월 23일
0

Problem Solving (BOJ)

목록 보기
190/230

문제 링크

23288: 주사위 굴리기 2


구현 방식

  • 전반적인 구현 흐름은 아래와 같다
    K만큼 for문을 돌면서,
    1. 현재 위치에서 현재 방향으로 이동했을 때, 칸이 있는지 없는지 판별하여 없다면 방향을 반대로 바꿔준다
    2. 다음 위치로 주사위를 이동시킨다
    3. 해당 경우에 획득할 수 있는 점수를 bfs 탐색으로 구해준다
    4. change_dice 함수를 호출하여 주사위 전개도를 변경해준다
      • 초기의 전개도를 dice = [1, 2, 3, 4, 5, 6]으로 설정해놓고 각 방향(동, 서, 남, 북)으로 이동했을 때 전개도가 어떻게 바뀌는 지 하드코딩 해줌
    5. B(칸 (x,y)에 있는 정수)와 변경된 전개도에 따른 A(주사위의 아랫면에 있는 정수)의 크기를 비교하여 방향을 변경해준다

코드

import sys
from collections import deque

dx = (0, 1, 0, -1)
dy = (1, 0, -1, 0)

N, M, K = map(int, sys.stdin.readline()[:-1].split())
board = [list(map(int, sys.stdin.readline()[:-1].split())) for _ in range(N)]
dice = [1, 2, 3, 4, 5, 6]

def change_dice(didx):
    d_0 = dice[0]; d_1 = dice[1]; d_2 = dice[2]; d_3 = dice[3]; d_4 = dice[4]; d_5 = dice[5]
    if didx == 0: #동
        dice[0] = d_3; dice[1] = d_1; dice[2] = d_0; dice[3] = d_5; dice[4] = d_4; dice[5] = d_2
    elif didx == 1: #남
        dice[0] = d_1; dice[1] = d_5; dice[2] = d_2; dice[3] = d_3; dice[4] = d_0; dice[5] = d_4
    elif didx == 2: #서
        dice[0] = d_2; dice[1] = d_1; dice[2] = d_5; dice[3] = d_0; dice[4] = d_4; dice[5] = d_3
    elif didx == 3: #북
        dice[0] = d_4; dice[1] = d_0; dice[2] = d_2; dice[3] = d_3; dice[4] = d_5; dice[5] = d_1

def bfs(x, y, check):
    q = deque([]); q.append((x, y))
    visit = [[False]*M for n in range(N)]; visit[x][y] = True
    cnt = 0

    while q:
        x, y = q.popleft()
        cnt += 1
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < N and 0 <= ny < M:
                if not visit[nx][ny] and board[nx][ny] == check:
                    visit[nx][ny] = True; q.append((nx, ny))
    return cnt


x, y, didx, answer = 0, 0, 0, 0
for k in range(K):
    if x+dx[didx] < 0 or x+dx[didx] >= N or y+dy[didx] < 0 or y+dy[didx] >= M: didx = (didx+2) % 4
    x, y = x + dx[didx], y + dy[didx]

    answer += (bfs(x, y, board[x][y]) * board[x][y]) #점수 획득

    change_dice(didx) #주사위 전개도 변경
    #전개도에 따른 방향 변경
    if dice[5] > board[x][y]: didx = (didx+1) % 4
    elif dice[5] < board[x][y]: didx = (didx+3) % 4
print(answer)
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글