일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 초원
- algorithm
- 칭기스칸 동상
- 월드프렌즈
- 교환학생
- 헬스
- 아부다비
- ICT봉사단
- 소프트웨어 아카데미
- Python
- 게르
- 백준
- 코로나
- 몽골 고기
- 여행
- 알고리즘
- 몽골 헬스장
- 몽골
- 한 줄로 서기
- 파이썬
- 테를지국립공원
- SWEA
- 울란바토르
- 몽골요리
- 테를지
- 독일
- 월드프렌즈 ICT 봉사단
- LG글로벌챌린저
- 칭기즈칸
- 담슈타트
- Today
- Total
맛있는물회
[맛있는물회] [파이썬] <백준 알고리즘> 1261 번 "알고스팟" 본문
문제 조건
알고스팟 운영진이 모두 미로에 갇혔다. 미로는 N*M 크기이며, 총 1*1크기의 방으로 이루어져 있다. 미로는 빈 방 또는 벽으로 이루어져 있고, 빈 방은 자유롭게 다닐 수 있지만, 벽은 부수지 않으면 이동할 수 없다.
알고스팟 운영진은 여러명이지만, 항상 모두 같은 방에 있어야 한다. 즉, 여러 명이 다른 방에 있을 수는 없다. 어떤 방에서 이동할 수 있는 방은 상하좌우로 인접한 빈 방이다. 즉, 현재 운영진이 (x, y)에 있을 때, 이동할 수 있는 방은 (x+1, y), (x, y+1), (x-1, y), (x, y-1) 이다. 단, 미로의 밖으로 이동 할 수는 없다.
벽은 평소에는 이동할 수 없지만, 알고스팟의 무기 AOJ를 이용해 벽을 부수어 버릴 수 있다. 벽을 부수면, 빈 방과 동일한 방으로 변한다.
만약 이 문제가 알고스팟에 있다면, 운영진들은 궁극의 무기 sudo를 이용해 벽을 한 번에 다 없애버릴 수 있지만, 안타깝게도 이 문제는 Baekjoon Online Judge에 수록되어 있기 때문에, sudo를 사용할 수 없다.
현재 (1, 1)에 있는 알고스팟 운영진이 (N, M)으로 이동하려면 벽을 최소 몇 개 부수어야 하는지 구하는 프로그램을 작성하시오.
Input
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미한다.
(1, 1)과 (N, M)은 항상 뚫려있다.
Output
첫째 줄에 알고스팟 운영진이 (N, M)으로 이동하기 위해 벽을 최소 몇 개 부수어야 하는지 출력한다.
생각한 아이디어
역시 BFS로 안풀린다 ㅎㅎ
BFS하니깐 테스트 케이스는 다 맞는데 제출하니깐 틀렸습니다가 발생한다.
https://www.acmicpc.net/board/view/50822
글 읽기 - 알고스팟 우선순위힙 이용 이유?
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
이러한 이유때문에 우선순위 큐 즉, 힙을 사용해야 한답니다!!
그래서 코드를 좀 수정하고 다익스트라 로직에 맞추어서 구현하였다.
일반적인 일차우너 배열아 아닌 이차원 맵이기 때문에 visited를 2차원 배열로 만들고 INF 로 초기화 하였다.
시작점인 0,0은 0으로 초기화하고 진행하였다.
사방으로 돌면서
if MAP[ny][nx]=='1':
if visited[ny][nx]>visited[y][x]+1:
visited[ny][nx]=visited[y][x]+1
heappush(heap,(cnt+1,ny,nx))
else:
if visited[ny][nx]>visited[y][x]:
visited[ny][nx]=visited[y][x]
heappush(heap,(cnt,ny,nx))
이렇게 구현하였다.
여기서도 visited로 방문한 곳은 방문하지 않도록 막아버린다면 다익스트라의 의미가 없어진다.
다시 한번 오더라도 크기의 비교를 진행해주어야한다.
마지막에 목적지의 visited값을 리턴하면 끝!
소스코드
#1261 알고스팟
import sys
from collections import deque
from heapq import heappop,heappush
import copy
input=sys.stdin.readline
dy=[-1,1,0,0]
dx=[0,0,-1,1]
def bfs(MAP,row,col):
heap= []
heappush(heap,(0,0,0))
visited=[[sys.maxsize for _ in range(col)]for _ in range(row)]
visited[0][0]=0
while heap:
cnt,y,x=heappop(heap)
for dir in range(0,4):
ny,nx=y+dy[dir],x+dx[dir]
if row>ny>=0 and col>nx>=0:
if MAP[ny][nx]=='1':
if visited[ny][nx]>visited[y][x]+1:
visited[ny][nx]=visited[y][x]+1
heappush(heap,(cnt+1,ny,nx))
else:
if visited[ny][nx]>visited[y][x]:
visited[ny][nx]=visited[y][x]
heappush(heap,(cnt,ny,nx))
return visited[row-1][col-1]
if __name__ == "__main__":
col,row = map(int,input().split())
MAP=[list(str(input().rstrip())) for _ in range(row)]
ans = bfs(MAP,row,col)
print(ans)
'''
3 5
001
101
001
011
000
'''
*파이썬 문법 정리
'IT > 알고리즘' 카테고리의 다른 글
[맛있는물회] [파이썬] <백준 알고리즘> 1300번 "K번째 수" (0) | 2020.06.04 |
---|---|
[맛있는물회] [파이썬] <백준 알고리즘> 1038번 "감소하는 수" (0) | 2020.06.04 |
[맛있는물회] [파이썬] <백준 알고리즘> 3055번 "탈출" (2) | 2020.06.02 |
[맛있는물회] [파이썬] <백준 알고리즘> 2636, 2638번 "치즈" (0) | 2020.06.01 |
[맛있는물회] [파이썬] <백준 알고리즘> 2631번 "줄세우기" (LIS 알고리즘) (0) | 2020.06.01 |