๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test/Algorithms

[๋ฐฑ์ค€] 2667. ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ/Python - Silver 1

by The Future Engineer, Lucy 2025. 2. 5.
728x90
๋ฐ˜์‘ํ˜•

โ“๋ฌธ์ œ

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

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 108548 KB, ์‹œ๊ฐ„: 92 ms

๋ถ„๋ฅ˜

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

 

๋ฌธ์ œ ์„ค๋ช…

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

โœ๐Ÿปํ’€์ด

๊ฐ ๋‹จ์ง€์— ์†ํ•˜๋Š” ์ง‘์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ € DFS์ธ์ง€ BFS์ธ์ง€ ์ƒ๊ฐํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋Š” DFS์™€ BFS ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•˜๋‹ค.

๋จผ์ €, ์ง‘์ด ์žˆ๋Š” ๊ณณ์„ ์ฐพ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒํ•˜์ขŒ์šฐ๋กœ ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ์ง‘์ด ์žˆ๋Š” ๊ณณ์ด๋ผ๋ฉด cnt๋ฅผ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ๋งŒ์•ฝ ์ฃผ๋ณ€์— ๋” ์ด์ƒ ์ง‘์ด ์žˆ๋Š” ๊ณณ์ด ์—†๋‹ค๋ฉด cnt๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋‹จ์ง€๋ฅผ ์ฐพ์•„ ์•ž์„œ ์ง„ํ–‰ํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ถœ๋ ฅ ์‹œ์—๋Š” ๊ฐ ๋‹จ์ง€์˜ ์ˆ˜์™€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๊ฐ ๋‹จ์ง€์˜ ์ง‘์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ’ป์ฝ”๋“œ

DFS๋กœ ํ‘ผ ํ’€์ด

import sys

input = sys.stdin.readline

N = int(input())
graph = [list(map(int, list(input().strip()))) for _ in range(N)]
res = []

def dfs(y, x):
    graph[y][x] = 0
    cnt = 1
    if 0 <= y + 1 < N and graph[y+1][x] == 1:
            cnt += dfs(y+1, x)
    if 0 <= x + 1 < N and graph[y][x+1] == 1:
            cnt += dfs(y, x+1)
    if 0 <= x - 1 < N and graph[y][x-1] == 1:
            cnt += dfs(y, x-1)
    if 0 <= y - 1 < N and graph[y-1][x] == 1:
            cnt += dfs(y-1, x)

    return cnt

for y in range(N):
    for x in range(N):
        if graph[y][x] == 1:
            res.append(dfs(y, x))

res.sort()
print(len(res))
print(*res, sep='\n')

BFS๋กœ ํ‘ผ ํ’€์ด

import sys
from collections import deque

input = sys.stdin.readline

N = int(input())
graph = [list(map(int, list(input().strip()))) for _ in range(N)]
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
res = []

def bfs(y, x):
    cnt = 1
    q = deque()
    q.append((y, x))
    graph[y][x] = 0
    while q:
        cy, cx = q.popleft()
        for i in range(4):
            ny, nx = cy + dy[i], cx + dx[i]
            if 0 <= ny < N and 0 <= nx < N and graph[ny][nx] == 1:
                graph[ny][nx] = 0
                q.append((ny, nx))
                cnt += 1

    return cnt

for y in range(N):
    for x in range(N):
        if graph[y][x] == 1:
            res.append(bfs(y, x))

res.sort()
print(len(res))
print(*res, sep='\n')

๐Ÿ“ํ›„๊ธฐ

DFS์™€ BFS ์ค‘์— ๋ญ˜๋กœ ํ’€์–ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋‘˜ ๋‹ค ์“ธ ์ˆ˜ ์žˆ์—ˆ๋‹ค..๐Ÿฅฒ

728x90
๋ฐ˜์‘ํ˜•