-
[ 백준 4963] 섬의 개수 (Kotlin 풀이)자료구조 & 알고리즘/BOJ 문제풀이 2022. 3. 8. 01:07
1.문제
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
2. 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다.
둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.
입력의 마지막 줄에는 0이 두 개 주어진다.
3. 출력
각 테스트 케이스에 대해서, 섬의 개수를 출력한다.
4. 포인트
- BFS 와 DFS 중 어떤 것을 사용할지를 고민한다. -> BFS
- 연결 개수를 구하기 때문에 node 접근 순서 상관 X
4. 문제 풀이
기본 풀이는 그래프 풀이에서 벗어나지 않는다.
https://easycodediary.tistory.com/107
[ 알고리즘 ] 그래프 & DFS , BFS
인접행렬에 대한 탐색문제에서 대표적으로 쓰이는 DFS 와 BFS 를 정리해보고자 합니다. 처음에는 DFS , BFS 의 구현에 있어서 잘 이해가 되지 않았지만 틀을 외워서 사용하다 보니 잘 이해가 되었습
easycodediary.tistory.com
문제를 보면 그래프 문제라는 것을 인식 할 수 있고 BFS 를 이용한다는 것을 캐치함이 중요하다.
다음으로는 연결 개수를 구하기 때문에 접근 순서가 상관이 없다.
또한 인접한 조건을 적용하기에 너무 많은 분기가 필요해서 이 부분은 4방과 대각 선을 모두 접근할 수 있게끔 이중포문으로 구현하되 IndexOut Exception 을 막기위해 예외 처리를 했다.
lateinit var array4963: Array<Array<Boolean>> fun main() = with(BufferedReader(InputStreamReader(System.`in`))) { val resultList = mutableListOf<Int>() while (true) { val (width, height) = readLine().split(' ').map { it.toInt() } if (width == 0 && height == 0) break array4963 = Array<Array<Boolean>>(height + 1) { Array<Boolean>(width + 1) { false } } //initialize for (i in 1..height) { var st = StringTokenizer(readLine(), " ") for (j in 1..width) { val value = st.nextToken().toInt() == 1 array4963[i][j] = value } } var resultCount = 0 for (i in 1..height) { for (j in 1..width) { if (array4963[i][j]) { bfs_4963(i, j, width, height) resultCount++ } } } resultList.add(resultCount) } resultList.forEach { println(it) } } fun bfs_4963(i: Int, j: Int, width: Int, height: Int) { val queue = LinkedList<Pair<Int, Int>>() queue.add(Pair(i, j)) while (queue.isNotEmpty()) { val pos = queue.poll() for (u in pos.first - 1..pos.first + 1) { for (v in pos.second - 1..pos.second + 1) { try { if (array4963[u][v]) queue.add(Pair(u, v)) array4963[u][v] = false } catch (e: IndexOutOfBoundsException) { continue } } } } }
'자료구조 & 알고리즘 > BOJ 문제풀이' 카테고리의 다른 글
[ 백준 2579 ] 계단 오르기 (+ 2165: 포도주 시식) (Kotlin 풀이) (0) 2022.02.03 [ 백준 9465] 스티커 (Kotlin 풀이) (0) 2022.02.01 [ 백준 11054 ] 가장 긴 바이토닉 부분 수열 (Kotlin 풀이) (0) 2022.02.01 [ 백준 10844 ] 쉬운 계단수 (Kotlin 풀이) (0) 2022.01.22 [백준 11726] 2xn 타일링 (Kotlin 풀이) (0) 2022.01.19