본문 바로가기
알고리즘

DFS/BFS

by Rudy 2021. 7. 6.

1.  스택 예제

 

stack=[]
stack.append(5)
stack.append(3)
stack.append(2)
stack.pop()
print(stack) #최하단 원소부터 출력한다.
print(stack[::-1]) #최상단 원소부터 출력한다.

 

2. 큐 예제

from collections import deque
#큐 구현을 위해서 deque 라이브러리 사용
queue=deque()

queue.append(5)
queue.append(3)
queue.append(2)
queue.append(7)
queue.popleft() #큐는 선입선출이다.

print(queue) #먼저 들어온 순서대로 출력
queue.reverse() #역순으로 바꾼다.
print(queue)

3. 재귀함수 예제

 

def recursive_function():
  print('재귀함수를 호출합니다.')
  recursive_function()
  

recursive_function()
def recursive_function(i):
  if i==100:
    return
  print(i, '번째 재귀 함수에서',i+1,'번째 재귀 함수를 호출합니다.')
  recursive_function(i+1)
  print(i,'번째 재귀 함수를 종료합니다.')

recursive_function(1)

4. 팩토리얼 예제

 

#반복적으로 구현한 n!
def factorial_iterative(n):
  result=1
  #1부터 n까지의 수를 차례대로 곱한다.
  for i in range(1,n+1):
    result*=i
  return result

#재귀적으로 구현한 n!
def factorial_recursive(n):
  if n<=1: #n이 1이하인 경우에는 1을 반환한다.
    return 1
  #n!=n*(n-1)!를 그대로 코드로 작성
  return n*factorial_recursive(n-1)


 #각각의 방식으로 구현한 n! 출력(n=5)


print('반복적으로 구현:',factorial_iterative(5))
print('재귀적으로 구현:',factorial_recursive(5))

 

5. 인접 행렬 방식 예제

인접 행렬: 2차원 배열로 그래프의 연결 관계를 표현하는 방식

 

 

# 인접 행렬 방식 예제

INF=99999
#2차원 리스트를 이용해 인접 행렬 표현
graph=[
  [0,7,5],
  [7,0,INF],
  [5,INF,0]
]

print(graph)

 

6. 인접 리스트 방식 예제

인접 리스트: 리스트로 그래프의 연결 관계를 표현하는 방식

 

# 인접 리스트 방식 예제

#행이 3개인 2차원 리스트로 인접 리스트 표현
graph=[[] for _ in range(3)]

#노드 0에 연결된 노드 정보 저장(노드,거리)
graph[0].append((1,7))
graph[0].append((2,5))

#노드 1에 연결된 노드 정보 저장(노드, 거리)
graph[1].append((0,7))

#노드 2에 연결된 노드 정보 저장
graph[2].append((0,5))

print(graph)

7. DFS 예제

 

#DFS 메서드 정의
def dfs(graph,v,visited):
  #현재 노드를 방문처리한다.
  visited[v]=True
  print(v,end=' ')
  #현재 노드와 연결된 다른 노드를 재귀적으로 방문한다.
  for i in graph[v]:
    if not visited[i]:
      dfs(graph,i,visited)

#각 노드가 연결된 정보를 리스트 자료형으로 표현한다.(2차원 리스트)

graph=[
  [],
  [2,3,8],
  [1,7],
  [1,4,5],
  [3,5],
  [3,4],
  [7],
  [2,6,8],
  [1,7]
]

#각 노드가 방문된 정보를 리스트 자료형으로 표현한다.(1차원 리스트)
visited=[False]*9

#정의된 DFS 함수를 호출한다.
print("방문한 노드의 순서")
dfs(graph,1,visited)

8. BFS 예제

from collections import deque
#BFS 메서드 정의
def bfs(graph,start,visited):
  #큐 구현을 위해 deque 라이브러리 사용
  queue=deque([start])
  #현재 노드를 방문 처리
  visited[start]=True
  #큐가 빌 때까지 반복한다.
  while queue:
    #큐에서 하나의 원소를 뽑아서 출력한다.
    v=queue.popleft()
    print(v,end=' ')
    #해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입한다.
    for i in graph[v]:
      if not visited[i]:
        queue.append(i)
        visited[i]=True

#각 노드가 연결된 정보를 리스트 자료형으로 표현한다.(2차원 리스트)

graph=[[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]]

#각 노드가 방문된 정보를 리스트 자료형으로 표현한다.(1차원 리스트)
visited=[False]*9

bfs(graph,1,visited)

 

9. 음료수 얼려 먹기

# N*M 크기의 틀에서 아이스크림 만들기

#N,M을 공백으로 구분하여 입력받는다. 
n,m=map(int,input().split())

#2차원 리스트의 맵 정보 입력받기
graph=[]
for i in range(n):
  graph.append(list(map(int,input())))

  #DFS로 특정한 노드를 방문한 뒤에 연결된 모든 노드들도 방문한다.


 def dfs(x, y) :

  if x<=-1 or x>=n or y<=-1 or y>=m:
    return False

  if graph[x][y]==0:
    graph[x][y]=1
  #상하좌우의 위치도 모두 재귀적으로 호출
     dfs(x-1,y)
     dfs(x,y-1)
     dfx(x+1,y)
     dfx(x,y+1)
     return True
     
  return False

  #모든 노드(위치)에 대하여 음료수를 채운다.
result=0
for i in range(n):
  for i in range(m):
    #현재 위치에서 DFS를 수행한다.
    if dfs(i,j)==True:
      result+=1

print("만들 수 있는 아이스크림의 총 갯수")
print(result)

10. 미로탈출

#미로 탈출

from collections import deque
#N,M을 공백으로 구분하여 입력받기
n,m=map(int,input().split())

#2차원 리스트의 맵 정보 입력받기
graph=[]
for i in range(n):
  graph.append(list(map(int,input())))

#이동할 네 방향 정의(상하좌우)
dx=[-1,1,0,0]
dy=[0,0,-1,1]

#BFS 소스코드 구현
def bfs(x,y):
  #큐 구현을 위해 deque 라이브러리 사용
  queue=deque()
  queue.append((x,y))
  #큐가 빌 때까지 반복
  while queue:
    x,y=queue.popleft()
    #현재 위치에서 네 방향으로의 위치 확인
    for i in range(4):
      nx=x+dx[i]
      ny=y+dy[i]

      #미로 찾기 공간을 벗어난 경우 무시
      if nx<0 or ny<0 or nx>=n or ny>=m:
        continue
      #벽이면 무시
      if graph[nx][ny]==0:
        continue
      #해당 노드를 처음 방문하면 기록한다.
      if graph[nx][ny]==1:
        graph[nx][ny]=graph[x][y]+1
        queue.append((nx,ny))
      #가장 오른쪽 아래까지의 최단 거리 반환
  return graph[n-1][m-1]

#BFS를 수행한 결과를 출력한다.
print(bfs(0,0))

 

'알고리즘' 카테고리의 다른 글

프로그래머스-폰켓몬  (0) 2022.05.26
프로그래머스-신규 아이디 추천  (0) 2022.05.25
[프로그래머스] 로또의 최고 순위와 최저 순위  (0) 2022.05.17
구현  (0) 2021.07.05
코테 공부- 그리디 알고리즘  (0) 2021.07.03

댓글