[PS] 백준 2146번 - 다리 만들기

2020. 1. 1. 13:53알고리즘/백준

문제

여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다는 생각을 하게 되었다. 그래서 그는, 생색내는 식으로 한 섬과 다른 섬을 잇는 다리 하나만을 만들기로 하였고, 그 또한 다리를 가장 짧게 하여 돈을 아끼려 하였다.

이 나라는 N×N크기의 이차원 평면상에 존재한다. 이 나라는 여러 섬으로 이루어져 있으며, 섬이란 동서남북으로 육지가 붙어있는 덩어리를 말한다. 다음은 세 개의 섬으로 이루어진 나라의 지도이다.

위의 그림에서 색이 있는 부분이 육지이고, 색이 없는 부분이 바다이다. 이 바다에 가장 짧은 다리를 놓아 두 대륙을 연결하고자 한다. 가장 짧은 다리란, 다리가 격자에서 차지하는 칸의 수가 가장 작은 다리를 말한다. 다음 그림에서 두 대륙을 연결하는 다리를 볼 수 있다.

물론 위의 방법 외에도 다리를 놓는 방법이 여러 가지 있으나, 위의 경우가 놓는 다리의 길이가 3으로 가장 짧다(물론 길이가 3인 다른 다리를 놓을 수 있는 방법도 몇 가지 있다).

지도가 주어질 때, 가장 짧은 다리 하나를 놓아 두 대륙을 연결하는 방법을 찾으시오.

입력

첫 줄에는 지도의 크기 N(100이하의 자연수)가 주어진다. 그 다음 N줄에는 N개의 숫자가 빈칸을 사이에 두고 주어지며, 0은 바다, 1은 육지를 나타낸다. 항상 두 개 이상의 섬이 있는 데이터만 입력으로 주어진다.

출력

첫째 줄에 가장 짧은 다리의 길이를 출력한다.

 

내가 푼 방법

문제에서 섬으로 이루어진 나라라 했으므로 섬의 갯수를 알아야 했다. 다시말해 섬을 나누는 기준이 필요했다.

위 그림과 같이 육지에 번호를 매기면 섬과 섬을 확실히 구분할 수 있다.

 

처음에는 이까지만 생각이 들었다. 일단 탐색을 해서 섬을 구분할 수는 있겠는데 그다음엔? 어떻게 해야할지 감이 안잡혔다.

 

그런데 입력데이터를 보니 N이 최대 100이었다. 최대 경우의 수를 다 따져보면

최대 지도 크기 100X100 = 10000

최대 경우의 수 10000X10000 =  1억

 

무조건 1초안에 결과를 뽑을 수 있었다.(이렇게 나가리로 해도 되는지 모르겠다.....😅)

 

번호를 매기는 방법은 BFS, DFS 어떤것으로 해도 상관없어서 쉬운 DFS로 했다.

 

그리고 최소 거리를 찾는 방법은 그냥 섬들을 큐에 넣고 검색한 큐를 제외한 모든 큐를 다시 탐색하였다.

사실 큐에 안넣고 그냥 싹다 이중 포문을 돌려도 결과는 마찬가지 일것이다😢

 

더 좋은 방법을 알게된다면 다시 풀어봐야겠다.

 

소스코드

https://github.com/jee9894/BOJ/blob/master/BOJ2146.cpp

 

'알고리즘 > 백준' 카테고리의 다른 글

[PS] 백준 2805 - 나무 자르기  (0) 2020.01.03
[PS] 백준 1654 - 랜선 자르기  (0) 2020.01.02