Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- buffer
- Stack
- 혼자 공부하는 C언어
- s
- C 언어 코딩 도장
- C programming
- stream
- datastructure
- 메모리구조
- 알기쉬운 알고리즘
- 이스케이프 문자
- Algorithm
- 이것이 자바다
- Selection Sorting
- insertion sort
- ㅅ
- coding test
- 윤성우의 열혈 자료구조
- JSON
- Serialization
- 윤성우 열혈자료구조
- list 컬렉션
- R
- Graph
Archives
- Today
- Total
Engineering Note
송아지 찾기 본문
it 취업을 위한 알고리즘 문제 풀이
문제

코드
import sys
from collections import deque
#sys.stdin = open("input.txt","rt")
cnt = 0
dir = [5,-1,1]
def bfs(s,e,visited):
global cnt
global dir
queue = deque()
queue.append((s,0))
visited[s] = True
while queue:
x, cnt = queue.popleft()
cnt += 1
for i in dir:
nx = x + i
if nx == e:
return
if nx<0 or nx>10000: continue
if visited[nx]:continue
queue.append((nx,cnt))
visited[nx] = True
s,e = map(int,input().split())
visited = [False]*10001
bfs(s,e,visited)
print(cnt)
문제해결방법
- 최소횟수를 찾으라고 했을 때 BFS알고리즘을 활용하면 좋다. 횟수를 그래프에서 레벨로 정의하고 각 레벨마다 이동가능한 좌표를 정점으로하는 그래프를 생각했을 때, 가장 가까운 레벨들을 탐색하면서 원하는 지점에 도착했는지를 체크하면서 그래프 탐색을 진행할 때 원하는 지점에 도착하면 그때의 레벨이 최소 이동 횟수이다. 이렇게 BFS는 가장 인접한 레벨의 정점을 먼저 탐색하는 알고리즘인데 가장 인접한 곳에서 원하는 정점이 나오지 않았다면 다음 레벨을 체크하는데 그곳에서 발견이 된다면 그 레벨보다 더 이전 레벨에는 원하는 정점이 없었다는 이야기이고 그 이후 레벨에서 발견되는 것은 최소횟수가 아니기 때문에 이러한 문제를 풀때 BFS를 활용하면 좋다.
- BFS 알고리즘을 활용하기 위해 방문한 방문한 정점과 레벨의 정보를 튜플 자료구조로 큐에 넣어주었다. 그리고 큐가 빌 때까지 자료를 꺼내주어 현재 꺼내진 좌표에서 이동가능한 +5,+1,-1 정점을 새로운 좌표로 그래프에 정점으로 만들어주고 이전 레벨에서 +1을 해주어 정점의 정보와 레벨 정보를 큐에 넣어준다. 이때 정점의 정보가 이미 방문했거나 문제의 주어진 범위를 벗어 난다면 방문할 필요가 없기 때문에 큐에 넣어주지 않는다.
- 이렇게 다음 좌표를 구하면서 다음 좌표가 문제의 end좌표이면 return을 해주고 그때 까지 이동한 횟수를 출력해주면 된다.
'Problem Solving > 파이썬 알고리즘 문제풀이(코딩테스트 대비)' 카테고리의 다른 글
| [파이썬 알고리즘 문제풀이] 동적계획법이란? 네트워크 선 자르기(Bottom-Up) (0) | 2022.05.24 |
|---|---|
| 인접행렬(가중치 방향그래프) (0) | 2021.07.05 |
| 두 리스트 합치기 (0) | 2021.06.09 |
| 카드 역배치(정올 기출) (0) | 2021.06.08 |
| 숫자만 추출 (0) | 2021.06.08 |
Comments