728x90
- 탐색
- 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
- 자료구조
- 데이터를 표현하고 관리하고 처리하기 위한 구조
- 오버플로
- 특정한 자료구조가 수용할 수 있는 데이터의 크기를 이미 가득 찬 상태에서 삽입 연산을 수행할 때 발생
- 즉, 저장 고안을 벗어나 데이터가 넘처흐를 때 발생
- 언더플로
- 특정한 자료구조에 데이터가 전혀 들어 있지 않은 상태에서 삭제 연산을 수행하면 데이터가 전혀 없는 상태
DFS
- Depth-Frist Search
- 깊이 우선 탐색
- 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
- 루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
- Stack
- O(N)
BFS
- Breadth Frist Search
- 너비 우선 탐색
- 가까운 노드부터 탐색하는 알고리즘
- 루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법
- Que
- O(N)
- 일반적인 경우 실제 수행 시간은 DFS보다 좋은 편
문제 3. 음료수 얼려먹기
2차원 + 상하좌우 탐색
->BFS
1. 구멍이 뚫린 지점 찾기
2. 이 구멍과 연결된 부분 너비 우선 탐색으로 찾기
반복
DFS, BFS 둘다 가능
from collections import deque
import sys
input = sys.stdin.readline
# 얼음 틀의 세로, 가로
N,M = map(int,input().split())
# 얼음 틀
ice = [list(map(int,input().rstrip())) for _ in range(N)]
# 아이스크림 수
cnt = 0
for r in range(N):
for c in range(M):
# 구멍인가?
if ice[r][c] == 0:
cnt += 1
que = deque()
que.append([r,c])
while que:
# 현 위치
cr,cc = que.popleft()
# 4방향 확인
for dr,dc in [[1,0],[-1,0],[0,1],[0,-1]]:
nr = cr + dr
nc = cc + dc
# 범위 내 구멍
if 0 <= nr < N and 0 <= nc < M and ice[nr][nc] == 0:
ice[nr][nc] = 1
que.append([nr,nc])
print(cnt)
문제 4. 미로 탈출
접근법 1
4방향 이동+최소거리 -> BFS
deque를 이용하여 4방향 확인하면서 조건(미로 내, 괴물이 없는지, 방문한 적 없는지)확인
from collections import deque
import sys
input = sys.stdin.readline
# 미로 세로, 가로
N, M = map(int,input().split())
# 미로
miro = [list(map(int,input().rstrip())) for _ in range(N)]
def miro_escape(miro):
# 방문 표시
visited = [[0]*M for _ in range(N)]
# [r,c,cnt]
que = deque()
# 시작 위치(0,0), 도착 위치(N-1,M-1)
# 시작 위치 표시
que.append([0,0,1])
visited[0][0]=1
while que:
# 현재 위치, 몇번 이동했는지
cr,cc,cnt = que.popleft()
# 4방향 확인
for dr,dc in [[1,0],[-1,0],[0,1],[0,-1]]:
nr = cr + dr
nc = cc + dc
# 미로 내, 괴물이 없는지, 방문한 적 없는지
if 0 <= nr < N and 0 <= nc < M and miro[nr][nc] == 1 and visited[nr][nc] == 0:
# 도착?
if nr == N-1 and nc == M-1:
return cnt+1
# 방문 표시
visited[nr][nc] = 1
que.append([nr,nc,cnt+1])
print(miro_escape(miro))
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
파이썬 시간 복잡도 in 연산자 (0) | 2023.04.02 |
---|---|
파이썬 구간 합 구하기 (accumulate) (0) | 2023.04.02 |
[백준] 18405. 경쟁적 전염 - Python (BFS 사용 X) (0) | 2023.03.23 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 4 구현 (0) | 2023.03.21 |
이것이 취업을 위한 코딩 테스트다 CHAPTER 11 그리디 문제 (0) | 2023.03.21 |
댓글