일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 소프티어
- 코드트리
- 마법의숲탐색
- 3Dreconstruction
- 삼성기출
- 왕실의기사대결
- 포탑부수기
- 수영대회결승전
- dfs
- ros
- 코드트리빵
- 백준
- DP
- 슈퍼컴퓨터클러스터
- 나무박멸
- BFS
- 루돌프의반란
- 순서대로방문하기
- 싸움땅
- 구현
- 조합
- DenseDepth
- 마이크로프로세서
- 토끼와 경주
- ICER
- 이진탐색
- Calibration
- 시뮬레이션
- ISER
- ARM
Archives
- Today
- Total
from palette import colorful_colors
[백준] 16236 아기 상어 with 파이썬 본문
난 상어가 무섭다
import sys
from collections import deque
input = sys.stdin.readline
INF = 1e9
N = int(input())
array = [list(map(int, input().split())) for _ in range(N)]
# 필요한 변수 초기화
shark_size = 2
eated_number = 0 # 상어 크기 증가를 위해 필요한 변수
time = 0
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 초기 상어 위치 파악하기, 먹을 물고기 파악하기
for i in range(N):
for j in range(N):
if array[i][j] == 9:
shark_x, shark_y = i, j
array[i][j] = 0
def bfs(start_x, start_y, shark_size): # 상어크기를 고려한 bfs
queue = deque()
queue.append((start_x, start_y))
range_array[start_x][start_y] = 0
while queue:
x, y = queue.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if (0 <= nx < N) and (0 <= ny < N) and (array[nx][ny] <= shark_size) and (range_array[nx][ny] == 0):
queue.append((nx, ny))
range_array[nx][ny] = range_array[x][y] + 1
while(1):
eatable_fishs = []
range_array = [[0 for _ in range(N)] for _ in range(N)]
# 먹을 물고기 탐색
for i in range(N):
for j in range(N):
if (0 < array[i][j]) and (array[i][j] < shark_size):
eatable_fishs.append([i, j])
# # 먹을 물고기가 없으면 break
if len(eatable_fishs) == 0:
break
# 먹을 물고기가 있으면 bfs로 거리 맵 만들기
bfs(shark_x, shark_y, shark_size)
# 거리 정보 더하기
can_move = 0
for i in range(len(eatable_fishs)):
if range_array[eatable_fishs[i][0]][eatable_fishs[i][1]] != 0:
eatable_fishs[i].append(range_array[eatable_fishs[i][0]][eatable_fishs[i][1]])
else: # 거리가 0이라면 도달할 수 없다는 뜻이므로 거리 무한으로 설정하기
eatable_fishs[i].append(INF)
# 가장 우선순위 높은 물고기로 만들기
eatable_fishs = sorted(eatable_fishs, key = lambda x : (x[2], x[0], x[1]))
# 가장 우선순위 높은 물고기로 이동
shark_x, shark_y = eatable_fishs[0][0], eatable_fishs[0][1]
array[shark_x][shark_y] = 0
if eatable_fishs[0][2] != INF: # 거리가 무한이 아닐때
time += eatable_fishs[0][2]
else:
break
eated_number += 1
eatable_fishs = []
# 먹은 개수가 상어 크기만해진다면 상어 크기 증가
if eated_number == shark_size:
shark_size += 1
eated_number = 0
print(time)
# # 확인용
# for i in range(N):
# for j in range(N):
# print(array[i][j], end = ' ')
# print()
# print()
'알고리즘 > 알고리즘 with 파이썬' 카테고리의 다른 글
[코드트리] 메이즈러너 with 파이썬 (0) | 2023.10.14 |
---|---|
[백준] 23288 주사위 굴리기 2 with 파이썬 (0) | 2023.10.12 |
[알고리즘 with 파이썬] - 최단거리(다익스트라, 플로이드 워셜) (0) | 2023.09.22 |
[알고리즘 with 파이썬] - DP(다이나믹 프로그래밍) (0) | 2023.09.21 |
[알고리즘 with Python] - 이진탐색 (0) | 2023.05.27 |