알고리즘 문제풀이/DFS & BFS

백준 2667 파이썬(DFS/BFS)

Aytekin 2021. 10. 3. 12:07

DFS문제다.

DFS/BFS 탐색문제를 계속해서 풀면서 느끼는건

 

1. 방문했던 곳을 한번더 방문하지 않기 위해서 적절한 표시를 남기는 방법

2. DFS는 재귀를 이용해서 BFS는 큐를 이용해서 푼다.

 

이 두가지를 고려하면서 문제를 풀기 시작하면 어느정도 풀리는 것 같다.

 

처음에는 DFS문제이므로 주어진 값들을 그래프로 그려보고 노드라고 보고 문제를 풀어보려고 했었다.

그런데 자기 자신으로 이어지는 노드들을 고려하는게 생각보다는 까다로웠다.

그래서 그냥 그래프, 노드 이런 개념들은 잠시 접어두고 2차원 배열 그 자체로 보고 문제를 풀기 시작했다.

 

먼저는 dfs함수를 정의했다.

주어진 좌표평면에서 벗어나지 않으면서

숫자가 1인 곳들을 표시하면서 탐색하는 함수를 만들었다.

 

그리고 표시를 할 때 각 단지별로 서로다른 숫자가 붙을 수 있게끔 만들었다.

 

마지막으론 단지별 아파트의 숫자를 세기위해서 반복문을 세개나 같이 썻다.

(사실 이 코드를 짜면서 반복문을 이렇게 많이 쓰면 또 시간초과가 뜨는건 아닐지 걱정이 되긴 햇지만..)

 

코드내용

# 2667 단지번호붙이기

# 입력값
n = int(input())
# 그래프
graph = []
for _ in range(n):
    graph.append(list(map(int,input())))

# dfs함수 정의
def dfs(x,y,apt_num):
    if x < 0 or x > n-1 or y < 0 or y > n-1:
        return False
    if graph[x][y] == 1:
        graph[x][y] = apt_num
        dfs(x,y+1,apt_num) # 상
        dfs(x,y-1,apt_num) # 하
        dfs(x-1,y,apt_num) # 좌
        dfs(x+1,y,apt_num) # 우
        return True
    else:
        return False

# 단지의 개수, 단지별 서로다른 숫자 할당하기
result = 0
apt_num = 2 
for x in range(n):
    for y in range(n):
        if dfs(x,y,apt_num) == True:
            apt_num += 1
            result += 1

# 아파트 단지별로 아파트 숫자 카운트
homes = []
for apt_num in range(2,result+2):
    count = 0
    for i in graph:
        for j in i:
            if apt_num == j:
                count += 1
    homes.append(count)
homes.sort()   

# 결과 출력
print(result)
for i in homes:
    print(i)

 

 

728x90

'알고리즘 문제풀이 > DFS & BFS' 카테고리의 다른 글

백준 7576 파이썬(BFS)  (0) 2021.10.04
백준 2178 파이썬(DFS/BFS)  (0) 2021.10.03
백준 1012 파이썬(DFS/BFS)  (0) 2021.10.03
백준 2606 파이썬(DFS/BFS)  (0) 2021.10.02
백준 1260 파이썬 (DFS/BFS)  (0) 2021.10.01