250x250
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 | 31 |
Tags
- JPQL
- shared lock
- 이진탐색
- exclusive lock
- 동적sql
- 스토어드 프로시저
- 힙
- 다대다
- 비관적락
- fetch
- 다대일
- 지연로딩
- FetchType
- 즉시로딩
- 스프링 폼
- BOJ
- 일대다
- 백트래킹
- 연관관계
- execute
- 데코레이터
- 유니크제약조건
- dfs
- eager
- 연결리스트
- querydsl
- SQL프로그래밍
- CHECK OPTION
- PS
- 낙관적락
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
(가설..) BFS - deque 일 경우와 heapq 일 경우 본문
728x90
# 1. 만약 q 가 deque 일 경우
# 만약 q가 deque 일 경우
<q, visited 에 시작점 추가>
while q:
<pop>
< || 원하는 로직 작성 || >
<for 다음으로 이동할 수 있는 것들>
<if -- not visited>
<q에 추가>
<방문 처리>
q 가 일반 큐일 경우, 시작점을 q와 visited에 먼저 채워 넣는다.
while문을 시작하고, for 문 전까지 원하는 로직만 작성한다.
다음으로 이동할 수 있는 칸에 대하여 for문을 수행하는데, 이 때는 방문하지 않은 점들만 탐색하고,
q에 추가하자마자 방문 처리를 해준다.
이는 가중치는 없고 오로지 먼저 도착하면 장땡인 문제에 적용된다.
# 2. 만약 q가 heapq 일 경우
# 만약 q가 heapq일 경우
<heapq에 시작점 추가, visited 는 빈 상태>
while q:
<pop>
<if -- visited : continue>
<방문처리>
< || 원하는 로직 작성 || >
<for 다음으로 이동할 수 있는 것들>
<heapq 에 추가>
먼저 도착한다고 되는게 아니라, 가중치가 있어서 이에 따른 우선순위가 존재할 때 적용할 수 있는 문제다.
일반 큐를 쓰지 않고, 우선순위 큐인 heapq 를 사용한다.
먼저 heapq에 시작점을 추가하는데, visited는 아직 넣지 않고 놔둔다. 방문처리는 while문에서 할 것이다.
while 문을 실행하고, 여느떄와 같이 가장 먼저 해야할 것은 pop.
pop을 하고 나서, 방문 여부를 확인한다. 방문 처리를 뒤에 q에 넣자마자 하는 것이 아니라, 꺼낸 다음에 방문 처리를 하기 때문에, 꺼내고 나서 방문 여부를 확인해야 한다.
꺼내자마자 방문 여부를 확인하고, 방문했으면 패스. 방문하지 않았으면 즉시 방문처리를 하고 원하는 로직을 실행한다.
그리고 도달할 수 있는 점들에 대해 for문을 수행하는데, 안에서 해줄 것은 heapq에 추가하는 것 외엔 없다.
위에서 언급했듯이 먼저 도착하면 장땡인게 아니라, 일단 싹다 후보지에 넣고 우선순위에 따라 고르는 것이기 때문에, 큐에 일단 무지성으로 집어넣는다.
이 가설이 맞을까?
'Problem Solving' 카테고리의 다른 글
[노트] 백트래킹 (1) | 2024.01.16 |
---|---|
[노트]deque에서, 원소를 계속 pop하면서 순회할 경우 (0) | 2024.01.16 |
최단 경로 찾기 (1) | 2023.12.28 |
다이나믹 프로그래밍과 메모이제이션 (0) | 2023.12.27 |
Parametric Search의 전형적인 문제 - BOJ2805 (1) | 2023.12.26 |