16236 - 아기상어*
2022. 5. 3. 14:02ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
# 가장 가까운 거리에 있는 물고기부터 순차적으로 탐색하면서 상어와 물고기와의 거리 찾음(먹을 수 있는 물고기만)
from collections import deque
def bfs(x, y):
q = deque([[x, y]])
visited = [[False]*N for _ in range(N)]
visited[x][y] = True
distance = [[0]*N for _ in range(N)]
locAndDistance = []
while q:
sx, sy = q.popleft()
for i in range(4):
nx = sx+dx[i]
ny = sy+dy[i]
if 0<=nx<N and 0<=ny<N and visited[nx][ny] == False:
# 아기상어보다 몸이 크거나, 아기상어가 있는 곳은 지나가지 못함
# 빈공간 또는 아기상어보다 작거나 같은 물고기가 있는 곳은 지나갈 수 있음
if graph[nx][ny]<=sharkSize:
visited[nx][ny] = True
q.append([nx, ny])
# 상/하/좌/우 중 하나로 이동하므로 거리는 무조건 1 증가
distance[nx][ny] = distance[sx][sy] + 1
# 물고기가 상어보다 작은 경우라면 먹을 수 있으므로, locAndDistance에 저장
if graph[nx][ny]<sharkSize and graph[nx][ny] != 0:
locAndDistance.append([nx, ny, distance[nx][ny]])
# 거리가 짧은 순 -> 위쪽에서 순(가장 위 물고기) -> 왼쪽 순(가장 왼쪽 물고기)
locAndDistance.sort(key=lambda x: (x[2], x[0], x[1]))
return locAndDistance
# 아기 상어의 크기는 2
# 큰 물고기가 있는 칸은 지나갈 수 없음
# 같은 물고기는 지나만 갈 수 있음
# 작은 물고기는 먹을 수 있음 -> 자신의 크기와 같은 수의 물고기를 먹을때마다 크기가 1씩 증가
# 먹을 수 있는 물고기가 없으면 엄마 상어에 도움 요청
# 먹을 수 있는 물고기가 1마리면 그 물고기 먹으러 이동
# 먹을 수 있는 물고기가 2마리 이상이라면 가장 가까운 물고기를 먹으러 감
# 위쪽 -> 왼쪽 물고기가 우선순위가 높음
# 아기 상어가 몇 초 동안 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있음?
if __name__ == '__main__':
N = int(input())
graph = []
for r in range(N):
temp = list(map(int, input().split()))
graph.append(temp)
if 9 in temp:
sharkLoc = [r, temp.index(9)]
sharkSize = 2; time = 0; cnt = 0
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
eatChk = [[False] * N for _ in range(N)]
while True:
x = sharkLoc[0]
y = sharkLoc[1]
locAndDistance = bfs(x, y)
if len(locAndDistance) == 0:
break
fishxyd = locAndDistance.pop(0)
fx = fishxyd[0]
fy = fishxyd[1]
d = fishxyd[2]
time += d; cnt += 1
sharkLoc = [fx, fy]
graph[x][y] = 0; graph[fx][fy] = 0
x = fx; y = fy
if cnt == sharkSize:
sharkSize += 1
cnt = 0
print(time)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
17822 - 원판 돌리기 (0) | 2022.05.03 |
---|---|
17144 - 미세먼지 안녕! (0) | 2022.05.03 |
14890 - 경사로* (0) | 2022.05.03 |
14889 - 스타트와 링크* (0) | 2022.05.03 |
14888 - 연산자 끼워넣기 (0) | 2022.05.03 |