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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[코드트리] 파이썬 - 고대 문명 유적 탐사 (1) | 2024.04.20 |
---|---|
[코드트리] 파이썬 - 나무 타이쿤 (0) | 2024.04.13 |
[코드트리] 파이썬 - 팩맨 (0) | 2024.04.12 |
[코드트리] 파이썬 - 루돌프의 반란 (0) | 2024.04.07 |
[백준 1138번] 파이썬 - 한 줄로 서기 (0) | 2024.03.19 |