[백준 문제풀이] 2667번 단지번호붙이기

RyeonD·2021년 5월 8일
0

백준 사이트의 2667번에 대한 문제 풀이 입니다. 참고로 저는 파이썬으로 문제를 풀었습니다.
https://www.acmicpc.net/problem/2667

(이 글은 이전에 풀어두었던 문제에 대해 코드 리뷰를 하기 위해 작성되었음을 알려드립니다.)

2667번의 단지번호붙이기의 문제는 다음과 같다.

이 문제를 풀기 위해서는 DFS와 BFS에 대해 알고 있어야한다. 두 탐색 방법에 대해서는 이전 게시글이 참고세요.
https://velog.io/@luvlik207/%EB%B0%B1%EC%A4%80-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4-1260%EB%B2%88-DFS%EC%99%80-BFS

바로 코드 리뷰를 해보고자 한다.(저는 BFS 탐색 방법을 적용하여 문제를 풀었습니다.)

# bfs 탐색을 위한 함수
def bfs(x, y):
    global cnt	# 전역 변수
    
    # x, y가 각각 지도를 벗어나지 않는지 확인
    if 0 <= x < n and 0 <= y < n:
    	# 지도의 x, y 좌표 위치에 집이 있고, 방문한 적이 없다면
        if matrix[x][y] == 1 and visited[x][y] == 0:
            visited[x][y] = 1  # 방문한것으로 체크
            cnt += 1	# 방문한 집의 수를 더해줌
            dfs(x-1, y) # 해당 위치의 왼쪽에 집이 있는지, 방문했는지 확인(아직 방문하지 않았다면 방문하기)
            dfs(x+1, y) # 해당 위치의 오른쪽에 집이 있는지, 방문했는지 확인(아직 방문하지 않았다면 방문하기)
            dfs(x, y-1) # 해당 위치의 위쪽에 집이 있는지, 방문했는지 확인(아직 방문하지 않았다면 방문하기)
            dfs(x, y+1) # 해당 위치의 아래쪽에 집이 있는지, 방문했는지 확인(아직 방문하지 않았다면 방문하기)

n = int(input())

# matrix는 지도의 입력값을 넣을 배열, visited는 방문을 확인하기 위한 배열
matrix = [[0]*n for i in range(n)]
visited = [[0]*n for i in range(n)]

# 입력 받은 지도를 matrix에 저장
matrix = [list(map(int, input())) for i in range(n)]

# 단지 별 가구 수를 넣을 배열
village = []

for i in range(n):
    for j in range(n):
    	# 집이 있고, 아직 방문하지 않았다면
        if matrix[i][j] == 1 and visited[i][j] == 0:
            cnt = 0	# 단지별로 가구 수를 카운트
            queue = []	# 단지별로 각 가구마다 상하좌우에 이웃이 있는지 확인하기 위한 큐
            bfs(i,j)
            village.append(cnt)	# 단지별 가구 수를 추가
            
print(len(village))  # 단지 개수 출력
village.sort()	     # 단지 별 가구 수 오름차순 정렬

# 오름차순 정렬된 단지 별 가구 수 출력
for i in village:
    print(i)
profile
I'm job hunting. I want to be a sw developer.

0개의 댓글

관련 채용 정보