생각과 고민이 담긴 코드

백준 - 단지번호붙이기 (DFS/BFS) / Silver 1 / 2667번 본문

Algorithm/백준

백준 - 단지번호붙이기 (DFS/BFS) / Silver 1 / 2667번

0_Hun 2021. 11. 22. 17:38

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

 

풀이

import sys

n = int(sys.stdin.readline())

city_map = []
result = []
global cnt
cnt = 0

for _ in range(n):
    temp = list(sys.stdin.readline())
    temp.pop()
    city_map.append(temp)


def dfs(row, col):
    global cnt
    cnt += 1
    city_map[row][col] = '0'

    if row > 0 and city_map[row-1][col] == '1':
        dfs(row - 1, col)
    if row < n-1 and city_map[row+1][col] == '1':
        dfs(row + 1, col)
    if col > 0 and city_map[row][col-1] == '1':
        dfs(row, col - 1)
    if col < n-1 and city_map[row][col + 1] == '1':
        dfs(row, col + 1)

    return


for i in range(n):
    for j in range(n):
        if city_map[i][j] == '1':
            dfs(i, j)
            result.append(cnt)
            cnt = 0

result.sort()
print(len(result))
for i in result:
    print(i)

전형적인 DFS/BFS 문제이다. 재귀를 이용하여 DFS방식으로 풀었으며

호출되는 dfs 함수 내에서 cnt 값을 공유하기 위해 전역 변수를 사용하였다.

 

그렇게 푼 후 더 좋은 코드가 없을까 고민하던중

전역 변수인 cnt 사용으로 dfs함수 선언 위치가 애매하여 가독성을 해친다고 생각되었고

또한 전역변수 사용을 최대한 지양하는 것이 좋다고 생각하여

다음과 같이 count 변수를 인자로 넣어주는 방식으로 리팩토링 하였다.

 

import sys


def dfs(row, col, count):
    count += 1
    city_map[row][col] = '0'

    if row > 0 and city_map[row - 1][col] == '1':
        count = dfs(row - 1, col, count)
    if row < n - 1 and city_map[row + 1][col] == '1':
        count = dfs(row + 1, col, count)
    if col > 0 and city_map[row][col - 1] == '1':
        count = dfs(row, col - 1, count)
    if col < n - 1 and city_map[row][col + 1] == '1':
        count = dfs(row, col + 1, count)

    return count


n = int(sys.stdin.readline())

city_map = []
result = []

for _ in range(n):
    temp = list(sys.stdin.readline())
    temp.pop()
    city_map.append(temp)

for i in range(n):
    for j in range(n):
        if city_map[i][j] == '1':
            result.append(dfs(i, j, 0))

result.sort()
print(len(result))
for i in result:
    print(i)