백준 & 프로그래머스
[백준] 16236번: 아기 상어 - 파이썬
hyukji
2023. 1. 4. 15:05
문제 보기
https://www.acmicpc.net/problem/16236
16236번: 아기 상어
N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가
www.acmicpc.net
풀이 및 코드
2차원 배열에서의 bfs를 이용한 완전 탐색 문제로 기존에 많이 나온 문제였다. 특별한 점은 해당 조건이었다.
- 거리가 가까운 물고기가 많다면, 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면, 가장 왼쪽에 있는 물고기를 먹는다.
필자는 상좌우하 순으로 물고기를 찾아 해결하고자 했다. 하지만 depth가 쌓이면서 꼭 상좌우하 순으로 물고기를 찾지 않는 다는 것을 깨달았고 같은 거리의 물고기들을 모두 찾은 후에 조건문으로 물고기를 선별하는 방식으로 코드를 수정했다.
https://www.acmicpc.net/board/view/100687
글 읽기 - 【아기 상어】 예제 시뮬레이션
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
개인 적으로 큰 도움을 받았던 글이다. 테스트 케이스의 중간 과정들을 정리해 주신 글이다. 만일 코드를 작성하다가 실패하고 포스팅을 방문하였다면 해당 글을 읽어보는 것도 큰 도움이 될 것이다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import deque | |
n = int(input()) | |
area = [list(map(int, input().split())) for _ in range(n)] | |
size = 2 | |
dy = [-1,0,0,1] | |
dx = [0,-1,1,0] | |
# 처음 상어 위치 찾기 | |
for i in range(n): | |
for j in range(n): | |
if area[i][j] == 9: | |
y,x = i,j | |
# 물고기 한마리 먹는 과정 | |
def bfs(y, x, size, cnt): | |
dq = deque() | |
dq.append([y,x]) | |
checked = [[0 for _ in range(n)] for _ in range(n)] | |
period = 0 | |
res = [] | |
while dq: | |
# 거리를 한칸 증가시킨 후 탐색 | |
period += 1 | |
for _ in range(len(dq)): | |
y, x = dq.popleft() | |
for d in range(4): | |
ny, nx = y + dy[d], x + dx[d] | |
# NxN에서 벗어나지 않으며 이전에 방문하지 않은 곳 | |
if 0 <= ny < n and 0 <= nx < n and checked[ny][nx] == 0: | |
# 해당 지역에 물고기 여부와 크기에 따른 조건문 | |
if area[ny][nx] == size or area[ny][nx] == 0: | |
checked[ny][nx] = 1 | |
dq.append([ny, nx]) | |
elif area[ny][nx] > size: | |
continue | |
else: | |
# 먹을 수 있다면 res에 저장 | |
res.append([ny, nx]) | |
# res에 저장된 값이 있다면 상, 좌 기준에 맞추어 하나 선택 | |
if len(res) > 0: | |
y, x = n, n | |
for ny, nx in res: | |
if ny < y or (ny == y and nx < x): | |
y, x = ny, nx | |
return period, y, x | |
return 0, -1, -1 | |
time = 0 | |
size = 2 | |
cnt = 0 | |
while True: | |
area[y][x] = 0 | |
# 물고기 찾는 데 걸린 시간, 물고기의 위치 | |
period, y, x = bfs(y, x, size, cnt) | |
# 탐색하는 데 걸린 시간 업데이트 | |
if period == 0: | |
print(time) | |
break | |
time += period | |
cnt += 1 | |
if cnt == size: | |
size += 1 | |
cnt = 0 |
해당 문제는 삼성 기출 문제로 solved.ac 기준 gold3에 랭크되어 있다.