'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 16236번: 아기 상어
1. 문제
- N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다.
- 물고기와 아기 상어는 모두 크기를 가지고 있고, 처음 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한칸씩 이동한다.
- 아기 상어는 자신 보다 큰 물고기 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다.
- 아기 상어의 이동 결정 방법은 아래와 같다.
- 더 이상 먹을 수 있는 물고기가 공간에 없다면 아기 상어는 엄마 상어에게 도움을 요청한다.
- 먹을 수 있는 물고기가 1마리라면, 그 물고기를 먹으러 간다.
- 먹을 수 있는 물고기가 1마리보다 많다면, 거리가 가장 가까운 물고기를 먹으러 간다.
- 거리는 아기 상어가 있는 칸에서 물고기가 있는 칸으로 이동할 때, 지나야하는 칸의 개수의 최솟값이다.
- 거리가 가까운 물고기가 많다면, 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면, 가장 왼쪽에 있는 물고기를 먹는다.
- 아기 상어는 자신의 크기와 같은 수의 물고기를 먹을 때 마다 크기가 1 증가한다.
- 아기 상어가 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는 시간을 출력한다.
2. 풀이
BFS
를 이용한 문제 풀이
heapq
를 통해 물고기의 크기와 위치를 저장한다.heapq
의 정렬을 이용해 (물고기의 크기, 물고기의 행, 물고기의 열)을 저장한다.
- BFS를 통해 상하좌우로 이동 후 거치지 않았던 곳이나 지나갈 수 있는 크기의 칸을 heap에 저장한다.
3. 코드
import heapq
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
di = [[-1,0], [1,0], [0,-1], [0,1]]
def solution():
heap = []
for i in range(N):
for j in range(N):
if arr[i][j] == 9:
heapq.heappush(heap, (0, i, j))
arr[i][j] = 0
body, eat, ret = 2, 0, 0
check = [[False] * N for _ in range(N)]
while heap:
d, x, y = heapq.heappop(heap)
if 0 < arr[x][y] < body:
eat += 1
arr[x][y] = 0
if eat == body:
body += 1
eat = 0
ret += d
d = 0
while heap:
heap.pop()
check = [[False] * N for _ in range(N)]
for dx, dy in di:
nd, nx, ny = d+1, x + dx, y + dy
if nx < 0 or nx >= N or ny < 0 or ny >= N:
continue
if check[nx][ny] or arr[nx][ny] > body:
continue
check[nx][ny] = True
heapq.heappush(heap, (nd, nx, ny))
return ret
print(solution())
- 결과 : 80 ms
References
🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 17140 - 이차원 배열과 연산 [Python(파이썬)] (0) | 2021.11.22 |
---|---|
[백준] 16235 - 나무 재테크 [Python(파이썬)] (0) | 2021.11.22 |
[백준] 16234 - 인구 이동 [Python(파이썬)] (0) | 2021.11.22 |
댓글