스택: 선입후출, 후입선출의 구조 , 박스 쌓기
큐: 선입선출의 구조, 대기줄 서기
재귀함수: 자기 자신을 호출하는 함수
def recursive_function():
print("재귀 함수 호출")
recursive_function()
recursive_funciton()
그래프: 노드와 간선으로 이루어진 구조, 트리 구조같은, 도로와 도시가 연결된 것 같은 구조
그래프 표현 방식 :
: (Depth- First Search), 깊이 우선 탐색, 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
스택 자료 구조에 기초함
데이터 개수가 N 개인 경우 O(N) 시간 소요
#DFS 메서드 정의
def dfs(graph, v, visited):
#현재 노드를 방문 처리
visited[v]=True
print(v, end='')
#현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[i]:
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 함수 호출
dfs(graph,1,visited)
#1 2 7 6 8 3 4 5
: (Breadth First Search), 너비 우선 탐색, 가까운 노드부터 탐색하는 알고리즘
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]:
queqe.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 함수 호출
bfs(graph, 1, visited)
#1 2 3 8 7 4 5 6
첫번째 줄에 얼음 틀의 세로 길이, N과 가로 길이 M 이 주어진다.(1 =<M,N=<1000)
DFS를 이용해 해결할 수 있다.
#입력 받기
n, m=map(int,intput().split())
graph=[]
for i in range(n):
graph.append(list(map(int,input())))
def dfs(x,y):
#주어진 범위 벗어나면 바로 종료
if x <= -1 or x>=n or y<= -1 or y >=n:
return False
#현재 노드를 아직 방문하지 않았다면
if graph[x][y] == 0:
#해당 노드 방문 처리
graph[x][y]=1
#상하좌우의 위치도 모두 재귀적으로 호출
dfs(x-1,y)
dfs(x,y-1)
dfs(x+1,y)
dfs(x,y+1)
return True
return False
#모든 노드(위치)에 대해서 음료수 채우기
result =0
for i in range(n):
for j in range(m):
#현재 위치에서 DFS 수행
if dfs(i,j) == True:
result +=1
print(result)
첫째 줄에 두 정수 N, M(4=<M,N=<200)이 주어집니다. 다음 N개의 줄에는 각각 M개의 정수(0,1)로 미로의 정보가 주어진다. 각각의 수들은 공백없이 붙어서 입력으로 제시된다. 또한 시작 칸과 마지막 칸은 항상 1이다. 0은 벽, 1은 길
첫째 줄에는 최소 이동 칸의 개수를 출력한다.
from collections import deque
n, m =map(int,input().split())
graph=[]
for i in range(n):
graph.append(list(map(int, input())))
#상 하 좌 우
dx=[-1,1,0,0]
dy=[0,0,-1,1]
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>=n or nx <0 or ny>=n or ny<0:
continue
#벽인 경우
if graph[nx][ny] ==0:
continue
#해당 노드를 처음 방문하는 경우에만 최단 거리 기록
if graph[nx][ny] == 1:
graph[nx][ny] =gragh[x][y]+1
queue.append((nx,ny))
#가장 오른쪽 아래까지의 최단 거리 반환
return graph[n-1][m-1]
#BFS를 수행한 결과 출력
print(bfs(0,0))
Reference
위 자료는 <이것이 코딩="" 테스트이다.="" with="" Python="">_ 나동빈 지음 을 바탕으로 공부한 내용입니다.이것이>