https://www.acmicpc.net/problem/23288
23288번: 주사위 굴리기 2
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼
www.acmicpc.net
import sys
from collections import deque
def bfs(x, y, num):
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 graph[nx][ny] == num:
cnt += 1
c[nx][ny] = 1
q.append([nx, ny])
if cnt == 0:
cnt = 1
return cnt
def rol_dice(dice,now):
if now == 0: #동
temp = dice[1][2]
dice[1][2] = dice[1][1]
dice[1][1] = dice[1][0]
dice[1][0] = dice[3][0]
dice[3][0] = temp
elif now == 1: #남
temp = dice[3][0]
dice[3][0] = dice[2][0]
dice[2][0] = dice[1][1]
dice[1][1] = dice[0][0]
dice[0][0] = temp
elif now == 2: #서
temp = dice[1][0]
dice[1][0] = dice[1][1]
dice[1][1] = dice[1][2]
dice[1][2] = dice[3][0]
dice[3][0] = temp
else: #북
temp = dice[0][0]
dice[0][0] = dice[1][1]
dice[1][1] = dice[2][0]
dice[2][0] = dice[3][0]
dice[3][0] = temp
n,m,k = map(int, sys.stdin.readline().split())
dice = [[2],
[4,1,3],
[5],
[6]]
graph = []
dx = [0,1,0,-1]
dy = [1,0,-1,0]
for _ in range(n):
graph.append(list(map(int,sys.stdin.readline().split())))
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, graph[x][y])) * graph[x][y]
rol_dice(dice, dir)
if dice[3][0] > graph[x][y]:
dir = (dir + 1) % 4
elif dice[3][0] < graph[x][y]:
dir = (dir + 3) % 4
print(ans)
후
요즘 문제 푸는게 힘들다 ㅋㅋㅋㅋ 구현만 잘하면 되는데 이상하게 문제를 계속 이상하게 읽어서
시간을 많이 허비한다
여기서 문제를 풀기위한 조건으로는
1) bfs를 구현할 줄 아나
2) 방향의 조건을 어떻게 할것인가
3) 주사위 결정 방법?
이정도 있을거 같다. 알고리즘을 알고 있나 보다는 문제에서 요구하는 것을 잘 구현하냐에 초점에 맞춰져 있다.
반응형
'알고리즘 공부 > BFS & DFS' 카테고리의 다른 글
[백준] 2583번 영역 구하기 - 파이썬 (0) | 2022.05.11 |
---|---|
[백준] 11724번 연결 요소의 개수 - 파이썬 (0) | 2022.05.06 |
[백준] 16236번 아기 상어- 파이썬 (0) | 2022.04.07 |
[백준] 15683번 감시 - 파이썬 (0) | 2022.04.05 |
[백준] 1325번 효율적인 해킹- 파이썬 (0) | 2022.03.28 |