๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 16236_์•„๊ธฐ ์ƒ์–ด

๋ฟŒ์•ผ._. 2022. 5. 26. 17:06

Gold III

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/16236)

<์•„๊ธฐ ์ƒ์–ด>

๋ฌธ์ œ 

 

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1 ×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด๋Š” ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ๋‹ค.
๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
   ๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผ ํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.
   ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

์•„๊ธฐ ์ƒ์–ด์˜ ์ด๋™์€ 1์ดˆ ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด, ์ด๋™๊ณผ ๋™์‹œ์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์นธ์€ ๋นˆ์นธ์ด ๋œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 2์ธ ์•„๊ธฐ ์ƒ์–ด๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋งˆ๋ฆฌ ๋จน์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 3์ด ๋œ๋‹ค.

๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N(2 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๋Š” 0, 1, 2, 3, 4, 5, 6, 9๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

0: ๋นˆ์นธ
1, 2, 3, 4, 5, 6: ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ
9: ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜

์•„๊ธฐ ์ƒ์–ด๋Š” ๊ณต๊ฐ„์— ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค.

 

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„์— ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution (Python)

import sys
from collections import deque

def baby_shark(arr, shark, shark_size,n):
    dx=[-1,1,0,0]
    dy=[0,0,-1,1]

    visited=[[0]*n for i in range(n)] # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    depth = [[0] * n for i in range(n)] # ๊ฑฐ๋ฆฌ
    visited[shark[0]][shark[1]]=1
    queue=deque([shark])

    while queue:
        temp=queue.popleft()
        for i in range(4):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            if 0<=x<n and 0<=y<n:
                if arr[x][y]<=shark_size and visited[x][y]==0:
                    visited[x][y]=1
                    depth[x][y]=depth[temp[0]][temp[1]]+1
                    queue.append([x,y])
    return depth

def main():
    n=int(input()) # ๊ณต๊ฐ„์˜ ํฌ๊ธฐ

    arr=[]
    for i in range(n):
        arr.append(list(map(int,sys.stdin.readline().split())))

    shark_size=2 # ์ฒ˜์Œ ํฌ๊ธฐ
    for i in range(n): # ์ฒ˜์Œ ์œ„์น˜
        for j in range(n):
            if arr[i][j]==9:
                shark=[i,j]
                arr[i][j]=0

    result=0
    eat_num=0 # ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜
    while True:
        eat = [] # ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ
        for i in range(n):
            for j in range(n):
                if arr[i][j]!=0 and arr[i][j]<shark_size:
                    eat.append([i,j])
        depth=baby_shark(arr, shark, shark_size,n)

        min_val=n*n
        if len(eat)==0: # ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ x
            break

        flag=False
        for i in eat:
            if depth[i[0]][i[1]]!=0 and min_val>depth[i[0]][i[1]]: # ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๊ฒƒ ์ฐพ๊ธฐ
                flag=True
                min_val=depth[i[0]][i[1]]
                min_xy=[i[0], i[1]]
        if flag==True:
            result+=min_val
            eat_num+=1
            shark=min_xy
            arr[shark[0]][shark[1]]=0
        else:
            break
        if eat_num==shark_size: # ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ ๋จน์„๋•Œ ํฌ๊ธฐ +1
            shark_size+=1
            eat_num=0
    print(result)

if __name__=="__main__":
    main()

 

 

  • baby_shark ( ๊ณต๊ฐ„์˜ ์ƒํƒœ , ์•„๊ธฐ ์ƒ์–ด ์œ„์น˜, ์•„๊ธฐ ์ƒ์–ด ํฌ๊ธฐ, ๊ณต๊ฐ„์˜ ํฌ๊ธฐ)
    :  dx, dy = ์ƒํ•˜์ขŒ์šฐ
    : visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    : depth = ๊ฑฐ๋ฆฌ
    : queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ ค ์ฒ˜์Œ ๊ฐ’์„ pop -> ์ƒํ•˜์ขŒ์šฐ ์ด๋™ํ•˜์—ฌ ๊ณต๊ฐ„ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ณ  (์•„๊ธฐ ์ƒ์–ด์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ) ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด -> ๋ฐฉ๋ฌธ ํ‘œ์‹œ, depth ์ €์žฅ ๋ฐ queue ์ถ”๊ฐ€
    : depth ๋ฐ˜ํ™˜
  • Main
    : ๊ณต๊ฐ„์˜ ํฌ๊ธฐ n ์ž…๋ ฅ
    : ๊ณต๊ฐ„์˜ ์ƒํƒœ arr ์ž…๋ ฅ
    : shark_size =  ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ
    : shark = ์•„๊ธฐ ์ƒ์–ด์˜ ์ฒ˜์Œ ์œ„์น˜ / ์•„๊ธฐ ์ƒ์–ด์˜ ์ฒ˜์Œ ์œ„์น˜๋ฅผ ๊ตฌํ•œ ํ›„ arr์˜ ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜ ๊ฐ’์„ 0์œผ๋กœ ์ €์žฅ
    : result = ์‹œ๊ฐ„ / eat_num = ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜ / eat = ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜
    : ์ข…๋ฃŒ ์กฐ๊ฑด๊นŒ์ง€ ๋ฐ˜๋ณต 
    -> arr์„ ์ˆœํ™˜ํ•˜์—ฌ ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜๋ฅผ eat์— ์ €์žฅ ํ›„ baby_shark ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ˜„์žฌ ์•„๊ธฐ ์ƒ์–ด ์œ„์น˜๋ถ€ํ„ฐ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•จ -> ๋งŒ์•ฝ ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด (eat์˜ ๊ธธ์ด๊ฐ€ 0์ด๋ผ๋ฉด) ์ข…๋ฃŒ but ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋‹ค๋ฉด eat ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํ™˜ํ•˜์—ฌ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณณ์„ ์ฐพ์Œ -> ๋งŒ์•ฝ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณณ์ด ์žˆ๋‹ค๋ฉด result์— ๊ฑฐ๋ฆฌ (=์‹œ๊ฐ„) ์ถ”๊ฐ€ ๋ฐ eat_num +1, ์•„๊ธฐ ์ƒ์–ด ์œ„์น˜ ์—…๋ฐ์ดํŠธ, ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์—ˆ์œผ๋ฏ€๋กœ arr์—์„œ ๊ทธ ์นธ์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์คŒ but eat์— ์ €์žฅํ•œ ๊ฐ’์ด ์žˆ์ง€๋งŒ ๊ทธ ์นธ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด ๋จน์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ข…๋ฃŒ -> ๋ฌผ๊ณ ๊ธฐ ๋จน์€ ์ˆ˜์ธ eat_num์ด ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ์ธ shark_size์™€ ๊ฐ™๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด ํฌ๊ธฐ +1
    : result ์ถœ๋ ฅ

 

โ“ ์™œ ํ‹€๋ ธ๋Š”๊ฐ€?

์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์œ„์น˜๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ depth๊ฐ€ 0์ด๋ผ๋ฉด ๊ทธ ์œ„์น˜๋กœ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋†“์ณ ์ฒ˜์Œ์— ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ depth๊ฐ€ 0์ด ์•„๋‹ ๋•Œ min_val๊ณผ min_xy๋ฅผ ๊ตฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

๋‘ ๋ฒˆ์งธ๋„ ์œ„์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์œผ๋กœ ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์œ„์น˜๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— result, eat_num, shark์œ„์น˜, arr ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ flag๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์— ์„ ์–ธํ•ด์ค€ min_val ๊ฐ’ ๋•Œ๋ฌธ์— ํ‹€๋ฆฐ ๊ฒƒ์ด์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ ์กฐ๊ธˆ ์˜ค๋ž˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. (0,0)๋ถ€ํ„ฐ (n-1, n-1)๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๋Š” n*n์ด๋ฏ€๋กœ min_val์„ n*n์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 


์ƒ๊ฐ๐Ÿค”

 

 

๋ถ„๋ช… ๋ฉฐ์น  ์ „์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‹ค๊ฐ€ ๊ทธ๋งŒ๋‘” ๊ฒƒ ๊ฐ™์€๋ฐ ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋ด๋„ ์ž‘์„ฑํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค..!

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๋‹ค์‹œ ๊ตฌํ˜„ํ–ˆ๋‹ค..!