일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- popleft
- 우선순위큐
- 합 구하기
- appendleft
- python3
- 파이썬
- deque
- Java
- BFS
- 소수판별
- 인프런
- 누적합
- c#
- DP
- 1일1솔
- 연관관계
- 소수찾기
- Python
- 그리디 알고리즘
- 백준
- 완전탐색
- mvc
- 브루투포스
- spring
- unity
- 프로그래머스
- pypy3
- C#강의
- JPA
- LCM
Archives
- Today
- Total
jae_coding
(백준 알고리즘 문제풀이) 2665번 미로만들기 본문
반응형
문제
문제 접근
- N x N의 바둑판
- 흰방(1): 통과가 가능하다
- 검은방(0): 통과가 불가능하다
- (1,1)에서 (8,8)을 가기 위해서 검은방을 흰방으로 최소한으로 바꿔서 통과하라
- 상하좌우에 visited를 이용하여 탐색을 하지 않은 곳은 인접 이전 visited값이나 visited +1값으로 변경
- 만약 흰방(1)일 경우에는 q.appendleft를 이용하여 우선 탐색(popleft를 사용하기 때문)하고 이전 visited값과 동일하게 해준다.
- 하지만 검은 방(0)일 경우에는 q.append를 이용하여 후순위로 미룬다. 그리고 visited + 1을 해준다. (찾는 것이 검은방을 흰방으로 변경하는 개수를 최소화한 것을 출력하라고 했기 때문이다)
코드
import sys
from collections import deque
def BFS(board):
q = deque()
q.append((0, 0))
visited = list([-1] * N for _ in range(N))
# 처음 위치는 방문한 것으로 가정
visited[0][0] = 0
d = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while q:
# print(q)
x, y = q.popleft()
# 도착지에 도착했을 경우 return
if x == N-1 and y == N-1:
return visited[x][y]
for i in range(len(d)):
dx = x + d[i][0]
dy = y + d[i][1]
if (0 <= dx < N) and (0 <= dy < N) and visited[dx][dy] == -1:
# 흰방일 경우
if board[dx][dy] == 1:
# 우선탐색
q.appendleft((dx, dy))
visited[dx][dy] = visited[x][y]
# 검은방일 경우
else:
q.append((dx, dy))
visited[dx][dy] = visited[x][y] + 1
N = int(sys.stdin.readline())
board = list()
for _ in range(N):
board.append(list(map(int, sys.stdin.readline().strip())))
print(BFS(board))
느낀점
BFS는 정말 많은 코딩테스트 문제를 푸는데에 사용이 되는 것을 느끼게 되었다.
앞으로 더욱 BFS를 잘 사용하기 위해서 많은 공부를 집중적으로 해보아야겠다.
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
(백준 알고리즘 문제풀이) 2559번 수열 (0) | 2022.07.15 |
---|---|
(백준 알고리즘 문제풀이)19638번 센티와 마법의 뿅망치 (0) | 2022.07.15 |
(백준 알고리즘 문제풀이) 16197번 두 동전 (0) | 2022.07.14 |
(백준 알고리즘 문제풀이) 15649번 N과 M(1) (0) | 2022.07.14 |
(백준 알고리즘 문제풀이) 15650번 N과 M(2) (0) | 2022.07.14 |
Comments