문제
풀이 (Python)
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 32 33 | from collections import deque # dx[0], dy[0] => 오른쪽 # dx[1], dy[1] => 왼쪽 # dx[2], dy[2] => 아래 # dx[3], dy[3] => 위 dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] n, m = map(int, input().split()) a = [list(map(int, list(input()))) for _ in range(n)] q = deque() check = [[False]*m for _ in range(n)] dist = [[0]*m for _ in range(n)] # 시작점 q.append((0,0)) check[0][0] = True dist[0][0] = 1 while q: x, y = q.popleft() for k in range(4): nx, ny = x+dx[k], y+dy[k] if 0 <= nx < n and 0 <= ny < m: if check[nx][ny] == False and a[nx][ny] == 1: q.append((nx,ny)) dist[nx][ny] = dist[x][y] + 1 check[nx][ny] = True print(dist[n-1][m-1]) | cs |
2. check로 들렸던 곳은 True, 들리지 않은 곳은 False로 두었다.
3. q에 있는 값을 꺼낸다.
4. 위, 아래, 왼쪽, 오른쪽을 N,M 을 벗어나지 않고 들리지 않았으며 이동할 수 있는 칸을 모두 들린다.
5. 들렸던 곳을 q에 넣어주고 거리 값, check= True를 넣어준다.
6. 3 ~ 5를 q에 아무것도 없어질 때 까지 계속 반복한다.
# dx[0], dy[0] => 오른쪽
# dx[1], dy[1] => 왼쪽
# dx[2], dy[2] => 아래
# dx[3], dy[3] => 위
문제 출처
'프로그래밍 > Baekjoon' 카테고리의 다른 글
(파이썬) 백준 알고리즘 11654번 아스키 코드 (0) | 2019.01.14 |
---|---|
(파이썬) 백준 알고리즘 10039번 평균 점수 (0) | 2019.01.10 |
(파이썬) 백준 알고리즘 15650번 N과 M(2) (0) | 2019.01.09 |
(파이썬) 백준 알고리즘 15649 번 N과 M(1) (0) | 2019.01.09 |
(파이썬) 백준 알고리즘 2309번 일곱 난쟁이 (0) | 2019.01.09 |