๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 2468 - ์•ˆ์ „ ์˜์—ญ

by YWTechIT 2021. 4. 19.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 2468 - ์•ˆ์ „ ์˜์—ญ

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ๋Š” ์–ด๋ ต์ง€ ์•Š์•˜์ง€๋งŒ, ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋‚˜๋ฆ„๋Œ€๋กœ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ์•„์ง ๊ตฌํ˜„ ์‹ค๋ ฅ์ด ๋›ฐ์–ด๋‚˜์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.

 

N์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๊ฐ€ 100 * 100์ด์–ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^3)์ด์–ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋Š”๋ฐ, ๊ฐ™์€ ์ง€์—ญ์—์„œ ๋‚ด๋ฆฌ๋Š” ๋น„์˜ ์–‘์— ๋”ฐ๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ผ์ค‘ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค.

 

๋ชจ๋“  ๋†’์ด๋ฅผ ์กฐ์‚ฌํ• ๋•Œ๋Š” ์ž…๋ ฅ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฒ”์œ„๋กœ ์žก์•˜๋‹ค. ์—ฌ๊ธฐ์„œ pythonic์ฝ”๋“œ๋ฅผ ๋ฐฐ์› ๋Š”๋ฐ 2์ฐจ์›์˜ ๋ฐฐ์—ด์—์„œ min, max๊ฐ’์„ ์ฐพ์„ ๋•Œ mapํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” +1์„ ํ•ด์ฃผ์ž ์•„๋‹ˆ๋ฉด ์˜ค๋‹ต ํŒ์ • ๋‚œ๋‹ค.

728x90

๊ทธ๋ฆฌ๊ณ  BFSํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜๋ฅผ x, y ์ขŒํ‘œ ์™ธ์—๋„ value๋ฅผ ํ•˜๋‚˜ ๋” ์คฌ๋Š”๋ฐ, ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋†’์ด๊ฐ€ ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ๋ฐ”๋€Œ๋ฏ€๋กœ ๋ณ€์ˆ˜๋กœ ๊ฐ™์ด ์ „๋‹ฌํ•ด์คฌ๋‹ค.

 

๋˜, ํ•ต์‹ฌ ํฌ์ธํŠธ๋Š” BFS๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ํ•œ๋ฒˆ ๋Œ๊ณ  ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค visited์™€ cnt๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๊ฑธ ์•ˆ ํ•ด์ค˜์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ฒซ ์ž…๋ ฅ ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์„ ์–ธํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ graph๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์„ค์ •ํ•˜๋‹ˆ๊นŒ ์ถœ๋ ฅ์ด ์ œ๋Œ€๋กœ ์•ˆ ๋‚˜์™”๋‹ค. ์ด๊ฑด ํŒŒ์ด์ฐธ์ด ๊ณ ์žฅ ๋‚œ ๊ฑฐ์•ผ!๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‚ฌ์‹ค  (๋‚ด ๋จธ๋ฆฌ๊ฐ€ ๊ณ ์žฅ ๋‚ฌ์—ˆ๋‹ค.)

 

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ•œ ๊ฐœ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋†’์ด๊ฐ€ 4 ์ดํ•˜์ธ ์ง€์ ์ด ๋ชจ๋‘ ์ž ๊ฒผ์„ ๋•Œ์˜ ์•ˆ์ „ํ•œ ์˜์—ญ์„ ๊ตฌํ•  ๋•Œ์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. BFS ํ•จ์ˆ˜ ๊ตฌํ˜„(์ƒ๋žต)
  2. ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•œ๋‹ค.(์กฐ๊ฑด: ๊ตฌํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋†’์ด๊ฐ€ graph[i][j] ์ด์ƒ์ด๊ณ  visited์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์„ ๋•Œ)
  3. BFS ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํšŸ์ˆ˜ ๋ˆ„์ 
  4. ์•ˆ์ „ํ•œ ์˜์—ญ์˜ ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 

 

์ฝ”๋“œ ์ œ์ถœํ•  ๋•Œ python3, pypy ๊ฐ๊ฐ ์ œ์ถœํ–ˆ๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋๋‹ค.

 

 

from collections import deque
import sys
input = sys.stdin.readline

def bfs(x, y, safe_area):    # BFS implementation
    queue = deque()
    queue.append((x, y))
    visited[x][y] = 1	# visited mark

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < N and 0 <= ny < N:
                if graph[nx][ny] >= safe_area and visited[nx][ny] == 0:    
                    visited[nx][ny] = 1
                    queue.append((nx, ny))

N = int(input())
graph = [list(map(int, input().split())) for _ in range(N)]
graph_min = min(map(min, graph))    # min_height
graph_max = max(map(max, graph))    # max_height
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

max_safe_area = graph_min   # init min_value
for safe_area in range(graph_min, graph_max+1):
    visited = [[0] * N for _ in range(N)]
    temp = 0
    for i in range(N):
        for j in range(N):
            if graph[i][j] >= safe_area and visited[i][j] == 0:
                bfs(i, j, safe_area)
                temp += 1
    if temp > max_safe_area:    # update safe_zone count
        max_safe_area = temp
print(max_safe_area)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€