[Python] 16236번 아기 상어

2025. 7. 1. 02:45·coding test/Baekjoon

https://www.acmicpc.net/problem/16236

 

dx=[-1,0,1,0]
dy=[0,-1,0,1]

def move(y,x):
    fishlist[y][x]=0 # <-첫시작 부분

    #먹을 수 있는 물고기 위치 담기
    fishs=[]
    for i in range(N):
        for j in range(N):
            if 0<fishlist[i][j]<shark_size:
                fishs.append([i,j])
    
    #물고기별 거리,위치 구하기
    res=[] #물고기별 거리,위치 담을 리스트
    for fish in fishs:
        queue=[[y,x,0]]
        visited=[[False for _ in range(N)] for _ in range(N)]
        visited[y][x]=True

        find_fish=False
        while queue:
            if find_fish:
                break

            qy,qx,qd=queue.pop(0)
            for d in range(4):
                ny=qy+dy[d]
                nx=qx+dx[d]
                nd=qd+1

                if 0<=ny<N and 0<=nx<N:
                    #먹을려는 물고기에 도달하면 stop
                    if ny==fish[0] and nx==fish[1]:
                        res.append([nd,ny,nx])
                        find_fish=True
                        break

                    if fishlist[ny][nx]<=shark_size: #지나갈 수 있는 물고기인지
                        if not visited[ny][nx]:
                            visited[ny][nx]=True
                            queue.append([ny,nx,nd])
    
    return res

#1.입력
N=int(input())
fishlist=[list(map(int,input().split())) for _ in range(N)]
#2.자료형 정의

#3.동작함수
# 아기상어 위치 찾기 -> 9인 곳 찾기
for y in range(N):
    for x in range(N):
        if fishlist[y][x]==9:
            sy,sx=y,x #상어가 있는 곳

shark_size=2
shark_cnt=0
distance=0
while True:
    ans=move(sy,sx)
    if ans: #물고기를 먹었다면
        ans=sorted(ans,key=lambda x:(x[0],x[1],x[2]))
        distance+=ans[0][0]
        sy,sx=ans[0][1],ans[0][2]

        shark_cnt+=1
        if shark_cnt==shark_size:
            shark_size+=1
            shark_cnt=0

    else: #물고기를 먹지 못했다면
        break     

#4.출력
print(distance)

 

 


처음 틀렸던 코드....

dx=[0,-1,1,0]
dy=[-1,0,0,1]

def move(iy,ix):
    queue=[[iy,ix,0]]
    visited=[[False for _ in range(N)] for _ in range(N)]
    visited[iy][ix]=True #<-현재 상어가 있는 곳 방문처리

    #가장 가까운 물고기 찾기
    while queue:
        y,x,dist=queue.pop(0)
        for d in range(4):
            ny=y+dy[d]
            nx=x+dx[d]
            if 0<=ny<N and 0<=nx<N: #범위를 넘지 않고
                if not visited[ny][nx]: #방문하지 않았다면
                    if matrix[ny][nx]<=shark: #상어 크기보다 작다면
                        if matrix[ny][nx]!=0 and matrix[ny][nx]<shark: #먹을 수 있다면
                            matrix[ny][nx]=0 #물고기 먹기
                            #print("can eat!!",ny,nx,"shark=",shark)
                            print("shark",shark)
                            for mit in matrix:
                                print(mit)
                            print()
                            return [dist+1,ny,nx]
                        else: #움직을 수만 있다면
                            visited[ny][nx]=True
                            queue.append([ny,nx,dist+1])                   
    return [0]

#1.입력
N=int(input())
matrix=[list(map(int,input().split())) for _ in range(N)]
#2.자료형 정의

#3.동작함수
# 아기상어 위치 찾기 -> 9인 곳 찾기
for y in range(N):
    for x in range(N):
        if matrix[y][x]==9:
            sy,sx=y,x #상어가 있는 곳

matrix[sy][sx]=0 #<-첫시작 부분
shark=2
shark_cnt=0
distance=0
while True:
    m=move(sy,sx)
    #print(m)

    if m[0]==0: #만약 더 이상 움직일 수 없다면
        break
    else:
        shark_cnt+=1 #현재 물고기 먹은 횟수
        if shark_cnt==shark: #아기 상어가 자신의 크기와 같은 수의 물고기 먹으면 크기 1 증가
            shark+=1
            shark_cnt=0

        distance+=m[0]
        sy,sx=m[1],m[2]

#4.출력
print(distance)

이건 처음 잘못 풀었던 코드인데

여기서 출력을 해보면

....

shark 4
[5, 4, 0, 0, 3, 4]
[4, 3, 0, 3, 4, 5]
[3, 2, 0, 5, 6, 6]
[2, 0, 0, 3, 4, 5]
[3, 2, 0, 6, 5, 4]
[6, 6, 6, 6, 6, 6]

shark 4
[5, 4, 0, 0, 3, 4]
[4, 0, 0, 3, 4, 5]
[3, 2, 0, 5, 6, 6]
[2, 0, 0, 3, 4, 5]
[3, 2, 0, 6, 5, 4]
[6, 6, 6, 6, 6, 6]

....

다음과 같이 동작하는데

파란색으로 이동해야 할 것이 빨간색으로 이동하여 물고기를 먹고 0으로 된 것을 볼 수 있다. 

'coding test > Baekjoon' 카테고리의 다른 글

[Python] 1753번 최단경로  (0) 2025.10.15
[Python] 1715번 카드 정렬하기  (2) 2025.08.30
[Python] 11286번 절댓값 힙  (0) 2025.05.22
[Python] 1543번 문서 검색  (0) 2025.05.22
[Python] 1106번 호텔  (1) 2025.05.19
'coding test/Baekjoon' 카테고리의 다른 글
  • [Python] 1753번 최단경로
  • [Python] 1715번 카드 정렬하기
  • [Python] 11286번 절댓값 힙
  • [Python] 1543번 문서 검색
wish404
wish404
자동 로그
  • wish404
    wish-log
    wish404
    • 홈
    • 태그
    • 방명록
    • github
    • 분류 전체보기 (75) N
      • log (8)
        • 블로그 관리 (5)
        • 에러 모음 (2)
      • coding test (47)
        • Algorithm (4)
        • Baekjoon (34)
        • SW Expert Academy (6)
        • etc (3)
      • 프로그래밍 언어 (7)
        • JAVA (7)
      • 데이터 엔지니어링 (5)
        • Kafka (0)
        • Spark (4)
        • Airflow (1)
        • Elasticsearch (0)
      • 머신러닝&딥러닝 (3)
        • Kaggle 스터디 (3)
        • 논문 리뷰 (0)
        • MLOps (0)
      • 신입 개발자가 되기까지 (5) N
        • 취준일기 (1)
        • SSAFY (2)
        • 프로젝트 (1) N
        • CS 공부 (1)
  • 인기 글

  • 태그

    다익스트라
    복습
    그리디
    최단 경로
    BFS
    벨만포드
    플로이드워샬
    중위순회
    복습해야지
    그리디 알고리즘
    싸피
    SSAFY
    틀린문제
    후위순회
    heapq
    dijk
    dfs
    dp
    Dijkstra
    전위순회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wish404
[Python] 16236번 아기 상어
상단으로

티스토리툴바