๐Ÿงฉ Algorithm/[BOJ] Silver

BOJ 2667๋ฒˆ : ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ (Python/Silver 1)

devCloud 2023. 5. 16. 03:48
728x90
 

2667๋ฒˆ: ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. 1์€ ์ง‘์ด ์žˆ๋Š” ๊ณณ์„, 0์€ ์ง‘์ด ์—†๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ด ์ง€๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ๊ฒฐ๋œ ์ง‘์˜ ๋ชจ์ž„์ธ ๋‹จ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ , ๋‹จ์ง€์— ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋ ค ํ•œ๋‹ค. ์—ฌ

www.acmicpc.net


์„ค๋ช…

<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. 1์€ ์ง‘์ด ์žˆ๋Š” ๊ณณ์„, 0์€ ์ง‘์ด ์—†๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 1๋กœ ์—ฐ๊ฒฐ๋œ ๊ณณ์€ ํ•˜๋‚˜์˜ ๋‹จ์ง€๋‹ค. (๋Œ€๊ฐ์„ ์— ์ง‘์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.) <๊ทธ๋ฆผ 2>๋Š” <๊ทธ๋ฆผ 1>์„ ๋‹จ์ง€๋ณ„๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ธ ๊ฒƒ์ด๋‹ค. ์ง€๋„๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ด ๋‹จ์ง€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ฐ ๋‹จ์ง€์— ์†ํ•˜๋Š” ์ง‘์˜ ์ˆ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

โœ“ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ

https://dev-cloud.tistory.com/161 -> ์œ ์‚ฌํ•œ ๋ฌธ์ œ์ด๋‹ค. BFS์™€ ๊ด€๋ จํ•ด์„œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์ด ์žˆ์œผ๋‹ˆ ๋ด๋ณด์ž.

Solution 

import sys
input = sys.stdin.readline #์ž…์ถœ๋ ฅ ํ–ฅ์ƒ
from collections import deque #๋ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ)

# ์ขŒ์šฐ์ƒํ•˜
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]

def bfs(i, j):
    visited[i][j] = 1 #๋ฐฉ๋ฌธ ํ‘œ์‹œ
    q = deque() #ํ ์ƒ์„ฑ
    q.append((i, j)) #ํ์— ์ดˆ๊ธฐ ์œ„์น˜ ๋„ฃ๊ธฐ
    homecnt = 1 #์ง‘์˜ ์ˆ˜

    while q:
        x, y = q.popleft() #ํ์—์„œ ํ˜„์žฌ ์œ„์น˜ ๋นผ๋‚ด๊ธฐ

        for z in range(4): #ํ˜„์žฌ ์œ„์น˜์—์„œ ์ขŒ์šฐ์ƒํ•˜ ํ™•์ธ
            nx = dx[z] + x 
            ny = dy[z] + y

            if -1 < nx < N and -1 < ny < N: #์ง€๋„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์กฐ๊ฑด
                if visited[nx][ny] == 0 and graph[nx][ny] == 1: #์ง‘์ด ์žˆ๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด
                    visited[nx][ny] = 1 #๋ฐฉ๋ฌธ ํ‘œ์‹œ
                    homecnt += 1 #์ง‘์˜ ์ˆ˜ ์นด์šดํŠธ
                    q.append((nx, ny)) #ํ์— ์ด๋™ํ•œ ์œ„์น˜ ๋„ฃ๊ธฐ
    homeans.append(homecnt) #ํƒ์ƒ‰ ๋๋‚ฌ์œผ๋ฉด ์ง‘์˜ ์ˆ˜ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ(์ •๋ ฌ์„ ์œ„ํ•ด์„œ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ)

N = int(input())
graph = [list(map(int, input().rstrip())) for _ in range(N)]
visited = [[0]*N for _ in range(N)] #0์€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒํƒœ
cnt = 0 #๋‹จ์ง€ ์ˆ˜
homeans = [] 

for i in range(N):
    for j in range(N):
        if visited[i][j] == 0 and graph[i][j] == 1: #์ง‘์ด ์žˆ๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด
            cnt += 1 #๋‹จ์ง€ ์ˆ˜ ์นด์šดํŠธ
            bfs(i, j)

print(cnt) #๋‹จ์ง€ ์ˆ˜ ์ถœ๋ ฅ
homeans.sort() #์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ์ง‘์˜ ์ˆ˜ ์ •๋ ฌํ•ด์ฃผ๊ธฐ
for i in homeans: #์ •๋ ฌ๋œ ์ง‘์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
    print(i)
728x90