728x90

코드트리 - 정육면체 한번 더 굴리기

소요시간 : 1시간 30분

# 접근 방법

  • 구현 문제 중에는 조금 쉬운 편이었던거 같다.
  • 문제에서 중요한 점은 주사위의 상,하,좌,우,앞,뒤를 헷갈리지 않고 잘 기록하는 것이다.
  • move_dice 함수를 시작하면서 다음 위치를 결정해준다.
    • 이 때, 격자를 벗어나게 되면 방향을 +2 % 4를 통해 반대방향으로 돌려주고 ni, nj를 dice_i, dice_j에 기록해준다.
  • bfs를 통해서 이번 턴에 얻게 되는 점수를 score에 더해주고 주사위를 돌려준다.
  • 직전의 진행 방향에 따라, 주사위의 상, 하, 좌, 우, 앞, 뒤의 값을 변경해주고 주사위의 아랫면격자의 값을 비교하여 다음 방향도 결정해주면 된다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque

UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
FRONT = 4
BACK = 5

def move_dice(i, j, d):
    global dice, dice_i, dice_j, now_dir, score
    ni, nj = i + di[d], j + dj[d]
    nd = d
    if not (0<=ni<N and 0<=nj<N):
        nd = (d+2)%4
        ni, nj = i + di[nd], j + dj[nd]
    now_dir = nd
    dice_i, dice_j = ni, nj

    score += get_score(dice_i, dice_j, arr[dice_i][dice_j])
    # 위 오른쪽 바닥 왼쪽 앞 뒤
    if now_dir == UP:
        dice = [dice[FRONT], dice[RIGHT], dice[BACK], dice[LEFT], dice[DOWN], dice[UP]]
    elif now_dir == DOWN:
        dice = [dice[BACK], dice[RIGHT], dice[FRONT], dice[LEFT], dice[UP], dice[DOWN]]
    elif now_dir == LEFT:
        dice = [dice[RIGHT], dice[DOWN], dice[LEFT], dice[UP], dice[FRONT], dice[BACK]]
    elif now_dir == RIGHT:
        dice = [dice[LEFT], dice[UP], dice[RIGHT], dice[DOWN], dice[FRONT], dice[BACK]]

    if arr[dice_i][dice_j] < dice[2]:
        now_dir = (now_dir+1) % 4
    elif arr[dice_i][dice_j] > dice[2]:
        now_dir = (4 + now_dir - 1) % 4

def get_score(gi, gj, num):
    q = deque()
    q.append((gi, gj))
    visited = [[False] * N for _ in range(N)]
    visited[gi][gj] = True
    cnt = 1
    while q:
        si, sj = q.popleft()
        for d in range(4):
            ni, nj = si+di[d], sj+dj[d]
            if 0<=ni<N and 0<=nj<N and visited[ni][nj] == False and arr[ni][nj] == num:
                cnt += 1
                q.append((ni, nj))
                visited[ni][nj] = True
    return cnt * num

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]

di, dj = [-1, 0, 1, 0], [0, 1, 0, -1]
dice = [1, 3, 6, 4, 2, 5]
dice_i, dice_j = 0, 0
now_dir = RIGHT
score = 0

for _ in range(M):
    move_dice(dice_i, dice_j, now_dir)

print(score)
728x90