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
- 위상 정렬(Topology Sort)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 알고리즘 개념
- 스택(Stack)
- BFS(Breadth First Search)
- 백준 18352번
- 분할 정복(Divide and Conquer)
- 백준 2504번
- 위상 정렬(Topological Sort)
- 백준 2261번
- 백준 10000번
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 1707번
- 백준 2493번
- 그래프(Graph)
- 백준 9012번
- 이분 그래프(Bipartite Graph)
- 백준 17608번
- 백준 2812번
- 이분 탐색(Binary Search)
- 그리디 알고리즘(Greedy Algorithm)
- DFS(Depth First Search)
- 동적 프로그래밍(Dynamic Programming)
- 백준 1948번
- 큐(Queue)
- 백준 21606번
- BFS
- DFS
- 트리(Tree)
- DFS & BFS
Archives
- Today
- Total
Always Be Wise
BFS : 미로만들기(백준 2665번) 본문
728x90
▶ 문제 : https://www.acmicpc.net/problem/2665
2665번: 미로만들기
첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.
www.acmicpc.net
##### 문제 #####
# n×n 바둑판 모양으로 총 n2개의 방이 있다.
# 일부분은 검은 방이고 나머지는 모두 흰 방이다.
# 검은 방은 사면이 벽으로 싸여 있어 들어갈 수 없다.
# 서로 붙어 있는 두 개의 흰 방 사이에는 문이 있어서 지나다닐 수 있다.
# 윗줄 맨 왼쪽 방은 시작 방으로서 항상 흰 방이고,
# 아랫줄 맨 오른쪽 방은 끝방으로서 역시 흰 방이다.
# 시작방에서 출발하여 길을 찾아서 끝방으로 가는 것이 목적인데,
# 아래 그림의 경우에는 시작 방에서 끝 방으로 갈 수가 없다.
# 부득이 검은 방 몇 개를 흰 방으로 바꾸어야 하는데 되도록 적은 수의 방의 색을 바꾸고 싶다.
# 검은 방에서 흰 방으로 바꾸어야 할 최소의 수를 구하는 프로그램을 작성하시오.
# 단, 검은 방을 하나도 흰방으로 바꾸지 않아도 되는 경우는 0이 답이다.
##### 입력 #####
# 첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고,
# 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다.
# 0은 검은 방, 1은 흰 방을 나타낸다.
##### 출력 #####
# 첫 줄에 흰 방으로 바꾸어야 할 최소의 검은 방의 수를 출력한다.
▶ 접근 방법
힙을 사용해서 바꾸어야 할 검은 방의 수를 최소로 유지하는 것이 중요했다.
힙에 데이터를 넣어 줄 때, 데이터의 입력 순서에 따라 결과가 다르게 나타난다.
예를 들어, 아래 코드에서 [change_count, now_x, now_y] 순으로 데이터를 입력하지 않으면
의도했던 것과 다른 결과가 나온다.
▶ 풀이 코드
import sys, heapq
# 방의 크기와 방의 정보를 입력 값으로 받는다.
room_size = int(sys.stdin.readline().rstrip())
room_info = [list(map(int, sys.stdin.readline().rstrip())) for _ in range(room_size)]
# for room in room_info:
# print(room)
# 방문 여부 리스트를 만들어준다.
visited = [[0] * room_size for _ in range(room_size)]
# 검은 방에서 흰 방으로 바꿀때마다 change_count를 갱신하고,
# 그 값이 최소 일때의 결과를 나타내는 함수이다.
def BFS():
heap = []
# 초기 값으로 변환 횟수 0, 시작점 행 좌표 0, 열 좌표 0을 넣어준다.
heapq.heappush(heap, [0, 0, 0])
# 시작점 방문 표시를 해준다.
visited[0][0] = 1
while heap:
change_count, now_x, now_y = heapq.heappop(heap)
# 마지막에 도착했을 때 change_count를 출력한다.
if now_x == room_size - 1 and now_y == room_size - 1:
print(change_count)
return
# 시작점에서 상하좌우를 다 탐색해본다.
for dir_x, dir_y in (-1, 0), (1, 0), (0, -1), (0, 1):
new_x, new_y = now_x + dir_x, now_y + dir_y
if 0 <= new_x < room_size and 0 <= new_y < room_size and visited[new_x][new_y] == 0:
visited[new_x][new_y] = 1
# 검은 방이었다면
if room_info[new_x][new_y] == 0:
# change_count를 1 늘려준다.
heapq.heappush(heap, [change_count + 1, new_x, new_y])
# 아니라면 그냥 넣어준다.
else:
heapq.heappush(heap, [change_count ,new_x, new_y])
BFS()
▶ 관련 링크
2021.11.18 - [알고리즘] - DFS(Depth First Search, 깊이 우선 탐색)이란?
2021.11.18 - [알고리즘] - BFS(Breadth First Search, 너비 우선 검색)이란?
2021.11.19 - [알고리즘] - 그래프(Graph)란?
2021.11.19 - [알고리즘] - BFS : 미로 탐색(백준 2178번)
2021.11.19 - [알고리즘] - BFS : 특정 거리의 도시 찾기(백준 18352번)
2021.11.19 - [알고리즘] - 다익스트라 알고리즘(Dijkstra Algorithm)이란?
2021.11.19 - [알고리즘] - BFS : 최소비용 구하기(백준 1916번)
'알고리즘 > 백준' 카테고리의 다른 글
BFS : 동전 2(백준 2294번) (0) | 2021.11.20 |
---|---|
BFS : 탈출(백준 3055번) (0) | 2021.11.20 |
BFS : 최소비용 구하기(백준 1916번) (0) | 2021.11.19 |
BFS : 특정 거리의 도시 찾기(백준 18352번) (0) | 2021.11.19 |
BFS : 미로 탐색(백준 2178번) (0) | 2021.11.19 |
Comments