일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Pattern
- Rails
- Spring
- 자바
- javscript
- Collections
- 파이썬
- 디자인패턴
- lambda calculus
- functional programming
- tcp
- Network
- DesignPattern
- 프로그래머스
- Collection
- 겨울카카오인턴
- solid
- Eclipse
- design-pattern
- exception
- JDBC
- Python
- 스택
- 함수형 프로그래밍
- 백준
- 큐
- 로버트마틴
- JavaScript
- Java
- 람다 칼큘러스
Archives
- Today
- Total
개발자 노트
[백준]2178.미로찾기 본문
문제설명
아주 기초적인 BFS문제. 최단거리를 찾아라.
접근
카카오2020 신입공채 블록이동하기 문제를 풀다가 아주 복잡하게 최단경로 문제를 풀고 있는 것 같아 이 문제를 살펴보았다.
접근1
개별의 이동에 대해 방문정보를 가지고 있어서 모두 탐색하도록 정했다.
- (1,1)에서 (2,1)이동가능하면 (2,1)노드와 함께 방문정보 (1,1),(2,1)을 que에 넣어준다.
- (1,1)에서 (1,2)이동가능하면 (2,2)노드와 함께 방문정보 (1,1),(1,2)를 que에 넣어준다.
- (2,1)과 (1,2)모두 (2,2)이동이 가능하므로 각각의 방문에 (1,1),(2,1),(2,2), (1,1),(1,2),(2,2)를 que에 넣어준다.
굵은 표시에 있는 내용을 보면 '최단거리'를 구하는 문제이므로 이럴 필요가 없다.
이전 이동에 넣은 que가 한 번 비워질 때마다 count가 1씩 증가하는데, 다익스트라 알고리즘을 생각하면 당연하다. v의 위치에 최단거리 d를 구했는데, d+x가 최단거리일 수 있겠는가?
또한, v에 도달했을 때 적용하는 알고리즘은 동일하므로 중복을 방지하기 위해서라도 visited를 통일해야 한다.
따라서 위 2가지 이유를 들어 visited를 통일시켜도 무방하다.
접근2
이건 다른 사람들의 코드를 참고했다. 위의 visited 통합을 포함하여 각 좌표별 count값을 가지는 테이블을 선언한다. 그러면 이는 visited와 count를 동시에 기록할 수 있게 된다. 이게 더 빨랐음!
구현
import sys
input = sys.stdin.readline
class QUEUE:
def __init__(self):
self.queue = [0]*50000
self.front = 0
self.rear = 0
def push(self,item):
self.front += 1
self.queue[self.front] = item
def pop(self):
self.rear += 1
return self.queue[self.rear]
N,M = map(int,input().split())
table = [input().rstrip() for _ in range(N)]
for i in range(N):
table[i] = '0'+table[i]+'0'
table.insert(0,'0'*(M+2))
table.append('0'*(M+2))
visited = [0 for _ in range(N+2)]
visited[1] = visited[1]|1<<1
que = QUEUE()
que.push([1,1,1]) # r좌표,c좌표,cnt
direction = {0:[0,1] , 1:[0,-1] , 2:[1,0] , 3:[-1,0]}
while True :
r,c,cnt = que.pop()
if r == N and c == M:
print(cnt)
break
for d in range(4):
dr = r+direction[d][0]
dc = c+direction[d][1]
if visited[dr]&(1<<dc) or table[dr][dc] == '0':
continue
visited[dr] = visited[dr]|(1<<dc)
que.push([dr,dc,cnt+1])
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준]5052 전화번호목록 (0) | 2020.03.31 |
---|---|
[백준]17822.원판돌리기 (0) | 2020.03.27 |
[2020카카오블라인드]자물쇠와 열쇠 (0) | 2020.03.25 |
[백준]2493.탑 (0) | 2020.03.19 |
[프로그래머스]네트워크 (0) | 2020.03.14 |
Comments