본문 바로가기

코딩테스트

코테 DFS

728x90

그래프 탐색 종류

DFS : Depth-first search (깊이 우선 탐색) <-> Stack

자신의 자식이 우선

 

DFS는 재귀함수를 사용하기 위해함

백트래킹에서 재귀함수 개념이 매우 중요

 

재귀함수

  • 자기 자신을 다시 호출하는 함수
  • 주의할점
    • 재귀함수가 종료되는 시점 반듯이 명시
    • 재귀함수의 깊이가 너무 깊어지면 Stack Overflow
  • DFS, 백트래킹에서 주로 사용 (그중 백트리킹에 많이 사용됨)

아이디어

  • 시작점에 연결된 Vertex 찾기
  • 연결된 Vertex를 계속해서 찾음(끝날 때 까지)
  • 더이상 연결된 Vertex 없을 경우 다음 노드 찾음

시간복잡도

  • 알고리즘이 얼마나 오래 걸리는지
  • DFS : O (V+E)
  • 검색할 그래프 : 2차원 배열
  • 방문여부 확인 : 2차원 배열(재방문 금지)
  • Queue를 사용하지 않음

백준 2667 그림 문제

 

1. 2중 for, 값 1 && 방문 X -> 재귀(DFS)

2. 값을 리스트에 저장

3. 정렬 이후 출력

import sys
input = sys.stdin.readline

N = int(input())
map = [list(map(int, input().strip())) for _ in range(N)]
chk = [[False] * for _ in range(N)]
result = []
each = 0

dy = 0,1,0,-1]
dx=[1.0.-1.0]

def dfs(y,x):
    global each
    each += 1
    for k in range(4):
        ny = y + dy[k]
        nx = x + dx[k]
        if 0 <=ny<N and 0 <=nx<N:
            if map[ny][nx] == 1 and chk[ny][nx] == False:
               chk[ny][nx] = Treu
               dfs(ny, nx)

for j in range(N):
    for i in ragnge(N):
         if map[j][i] == 1 and chk[j][i] == False:
         chk[j][i] = True
         each = 0
         dfs(j, i)
         result.append(each)
        # 방문 체크 표시
        # DFS로 크기 구하기
        # BFS : 함수 호출, 리턴값으로 크기
        # 크기를 결과 리스트에 넣기

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

'코딩테스트' 카테고리의 다른 글

백준 1620 : 나는야 포켓몬 마스터 이다솜  (0) 2025.03.06
코테 BFS  (0) 2025.02.10
백준 2869 : 달팽이는 올라가고 싶다.  (1) 2024.09.26
백준 1193 : 분수찾기  (0) 2024.09.26
백준 1062번 가르침  (0) 2024.09.24