일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 카카오 기출
- Code Refactoring
- 알고리즘
- Brute Force
- Queue
- Algorithm
- 완전탐색
- binary search
- Greedy
- 큐
- Dynamic Programming
- 정렬
- 힙
- 동적계획법
- graph
- programmers
- django
- DP
- heap
- 백준
- sort
- string
- 코딩테스트
- 문자열
- 그래프
- 프로그래머스
- DFS
- BFS
- 탐욕법
- DVWA
Archives
- Today
- Total
생각과 고민이 담긴 코드
백준 - 단지번호붙이기 (DFS/BFS) / Silver 1 / 2667번 본문
문제 : 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)
'Algorithm > 백준' 카테고리의 다른 글
백준 - 치킨 배달 (완전 탐색) / Gold 5 / 15686번 (0) | 2021.11.21 |
---|---|
백준 - 연구소 (DFS, BFS, 완전탐색) / Gold 5 / 14502번 (0) | 2021.11.17 |
백준 - 트리의 부모 찾기 (DFS, BFS) / Silver 2 / 11725번 (0) | 2021.11.17 |
백준 - 물건 팔기 (정렬, 완전 탐색) / Silver 3 / 1487번 (0) | 2021.11.12 |
백준 - 연산자 끼워넣기 (완전 탐색) / Silver 1 / 14888번 (0) | 2021.11.02 |