๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DFS,BFS

[๋ฐฑ์ค€]2468๋ฒˆ: ์•ˆ์ „ ์˜์—ญ

by syLim___ 2023. 2. 25.
728x90

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

 

2468๋ฒˆ: ์•ˆ์ „ ์˜์—ญ

์žฌ๋‚œ๋ฐฉ์žฌ์ฒญ์—์„œ๋Š” ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๋Š” ์žฅ๋งˆ์ฒ ์— ๋Œ€๋น„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋‹ค. ๋จผ์ € ์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๊ทธ ์ง€์—ญ์— ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ ธ์„ ๋•Œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š”

www.acmicpc.net


ํ’€์ด ๋ฐฉ๋ฒ•:  BFS

 

๋น„๋Š” ๋†’์ด 0๋ถ€ํ„ฐ ๊ทธ ์ง€์—ญ์˜ ์ตœ๊ณ  ๋†’์ด๊นŒ์ง€ ์ž ๊ธฐ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

0๋ถ€ํ„ฐ ์ตœ๊ณ ๋†’์ด๊นŒ์ง€ ๋‚ด๋ ธ์„ ๋•Œ์˜ ์•ˆ์ „ ์˜์—ญ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์€ ํ›„, ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

 


0๋ถ€ํ„ฐ ์ตœ๊ณ  ๋†’์ด๊นŒ์ง€ ์•ˆ์ „ ์˜์—ญ ๊ฐœ์ˆ˜ ๋ชจ๋‘ ๊ตฌํ•˜๊ธฐ

maxH=max(map(max, graph)) #์ž…๋ ฅ๋ฐ›์€ ์ง€์—ญ์˜ ์ตœ๋Œ€ ๋†’์ด

result=[]
for rain in range(maxH):
  visited = [[0 for j in range(n)] for i in range(n)]
  cnt=0
  for i in range(n):
    for j in range(n):
      if bfs(i,j,rain)==True:
        cnt+=1
  result.append(cnt)

 -๋ฐฉ๋ฌธ์ฒดํฌ์šฉ ์ด์ฐจ์›๋ฐฐ์—ด(visited)์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 -๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ, ๋น„๊ฐ€ ์„ค์ •๋†’์ด(rain)๊นŒ์ง€ ์ž ๊ธฐ๊ฒŒ ํ–ˆ์„ ๋•Œ ์•ˆ์ „์˜์—ญ(cnt)์˜ ๊ฐœ์ˆ˜๋ฅผ bfs๋กœ ๊ตฌํ•ด์ค€๋‹ค.

 -๊ณ„์‚ฐํ•œ ์•ˆ์ „์˜์—ญ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ(result)์— ๋„ฃ๋Š”๋‹ค.

 


bfs(row ์ขŒํ‘œ, col ์ขŒํ‘œ, ๋น„๊ฐ€๋‚ด๋ฆฌ๋Š”๋†’์ด)

from collections import deque

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

def bfs(x,y,rain):
  if visited[x][y]==1 or graph[x][y]<=rain: #๋ฐฉ๋ฌธํ•œ์ ์žˆ์œผ๋ฉด
    return False
    
  visited[x][y]=1 #๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
  q = deque()
  q.append((x,y))

  while q:
    a, b = q.popleft()

    for i in range(4): #์ƒํ•˜์ขŒ์šฐ ์ฒดํฌ
      nx = a + dx[i]
      ny = b + dy[i]

      #์˜์—ญ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด
      if 0<=nx<n and 0<=ny<n and visited[nx][ny]==0:
        visited[nx][ny]=1 #๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
        #์•ˆ์ „ ์˜์—ญ์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ์–ด์ฃผ๊ธฐ
        if graph[nx][ny]>rain:
          q.append((nx,ny))
          
  #bfs๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด true๋ฅผ ๋ฆฌํ„ด
  return True
728x90