반응형
250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- SSAFY
- React
- 싸피 7기 입학식
- 프로그래머스
- pytorch
- git
- SWEA
- 프로그래머스 고득점 kit
- 코딩 교육
- 알고리즘
- 전이학습
- SSAFY 8기
- 웹 표준 사이트 만들기
- 삼성 청년 SW 아카데미
- 삼성청년sw아카데미
- dfs
- Learning
- ssafy 7기
- bfs
- 백준7576 bfs
- ssafy 7기 교수님
- 이코테
- 코딩교육
- 유니온 파인드
- SSAFYcial
- ssafy 7기 합격
- DP
- 백준
- SSAFY 입학식
- DenseNet
Archives
- Today
- Total
개미의 개열시미 프로그래밍
[알고리즘] 이코테 음료수 얼려 먹기, 미로탈출 - 파이썬 본문
728x90
반응형
이제 코딩 테스트를 본격적으로 공부하려 한다. 원래 학기가 끝나고 준비하려 했지만 왠지 모를 불안감에 시작했다..
친구가 알려준 순서와 나동빈의 이코 테를 참고해서 같이 공부하려 한다. 친구가 알려준 알고리즘 공부 순서는 '백 트랙킹, DFS, BFS, 브루트 포스, 유니온 파인드 기타 자료구조(큐, 스택, 리스트)'이고 이코테에서는 백트래킹 부분이 없어서 따로 유튜브 강의를 보고 백준을 풀 생각이다.
먼저, 오늘은 BFS와 DFS를 공부했고 표로 간단히 정리하면 아래와 같다.
DFS | BFS | |
동작원리 | 스택 | 큐(dequeue) |
구현방법 | 재귀 함수 이용 | 큐 자료구조 이용 |
주의할 점은 BFS문제를 풀때 dequeue를 활용한다는 점이다.
문제 1) 음료수 얼려먹기
# 입력받기
n, m = map(int, input().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 >= m:
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):
if dfs(i, j) == True:
result += 1
print(result)
문제풀이 : 제한시간이 30분을 넘겨 답을 보면서 풀이를 익혔다. 이 문제는 구멍이 뚫려있는 부분을 0으로 막힌 부분을 1로 표시하였는데 0으로 된 부분만을 묶은 수를 구해야 했다. 처음에는 당연히 BFS풀이로 접근해야 하나 싶었지만 풀이에서는 DFS를 활용했다. 코드를 보면 0인 지점에 대해 상하좌우를 재귀적으로 탐색하여 방문했을 경우 1로 표시하고 True를 반환하게 하여 반환된 True의 수를 카운트하는 방식으로 하였다.
문제 2) 미로 탈출
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):
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 nx >= n or ny < 0 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]
print(bfs(0,0))
문제풀이 : 이 문제도 역시나 시간 초과.. 연습이 많이 필요한 것 같다. 아직 많은 문제를 풀어보진 않았지만 최소 거리를 구하는 문제는 DFS로 푸는 것 같다. 이유는 한 노드를 시작으로 가까운 노드를 방문하기 때문에 방문할 때마다 1을 더해 주고 난 뒤 마지막에 도착지점의 N, M을 출력해보면 되기 때문이다.
728x90
반응형
'알고리즘 > DFS, BFS, 백트래킹' 카테고리의 다른 글
[알고리즘] 백준2178 미로탐색 - 파이썬 (0) | 2021.06.02 |
---|---|
[알고리즘] 백준 1012 유기농 배추 - 파이썬 (0) | 2021.06.01 |
[알고리즘] 백준 2667 단지번호붙이기 - 파이썬 (0) | 2021.06.01 |
[알고리즘] 백준 2606 바이러스 - 파이썬 (2) | 2021.05.31 |
[알고리즘] 백준 1260 DFS와 BFS - 파이썬 (0) | 2021.05.30 |
Comments