-
영역 구하기 kotlin코딩테스트📝 2022. 9. 20. 13:52
import java.io.BufferedReader import java.io.InputStreamReader import java.util.StringTokenizer var count = 0 fun blockChecker(map: Array<IntArray>, list: List<Int>) { for (i in list[1] until list[3]) { for (j in list[0] until list[2]) { map[i][j] = 1 } } } fun areaDfs(map: Array<IntArray>, x: Int, y: Int, M: Int, N: Int) { map[y][x] = 1 count++ if (M > y+1 && map[y + 1][x] == 0) { areaDfs(map, x, y + 1,M, N) } if (y-1 >= 0 && map[y - 1][x] == 0) { areaDfs(map, x, y - 1,M, N) } if (N > x+1 && map[y][x + 1] == 0) { areaDfs(map, x + 1, y, M, N) } if (x-1 >= 0 && map[y][x - 1] == 0) { areaDfs(map, x - 1, y, M, N) } } fun areaCalculate( map: Array<IntArray>, M: Int, N: Int ): List<Int> { val list = mutableListOf<Int>() for(i in 0 until M) { for(j in 0 until N) { if (map[i][j] == 0) { count = 0 areaDfs(map, j, i, M, N) list.add(count) } } } list.sort() return list } fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val (M, N, K) = br.readLine().split(" ").map { it.toInt() } val map = Array(M) { IntArray(N) } for (i in 0 until K) { val arr = br.readLine().split(" ").map { it.toInt() } blockChecker(map, arr) } val list = areaCalculate(map, M, N) val n = list.size println(n) for(i in 0 until n) { if(i != 0) { print(" ") } print(list[i]) } }
조언을 듣고 공부 방식을 바꿔보았는데
오랜만에 재미있다....
느려도 꾸준히갈 수 있도록 최대한 풀어보자
일단 문제는 차분히 읽어보니 이해가 갔다.
먼저 2차원 배열에 제시된 사각형을 1로 변경 후 섬의 개수 문제처럼 풀면 되는데
다른 점은 전체의 면적이 아니라 각각의 면적을 구해야 하기 때문에 count를 리셋하고, 다시 세는 것을 반복해야 한다.
아직 count의 위치를 어디에 둬야 할지 감이 잘 안 온다.
그리고 부등호를 잘 못 놔서 ㅡㅡ 오래 걸렸다.
'코딩테스트📝' 카테고리의 다른 글
백준 좌표 정렬하기 kotlin 11650 (0) 2022.07.05 [9416 백준] 파도반 수열 kotlin (0) 2022.06.30 [오알] 백준 1912번 연속합 (0) 2022.06.27 Kotlin 백준 11722 가장 긴 감소하는 부분 수열 (0) 2022.06.25 [백준] 11055 가장 긴 증가하는부분 수열 (0) 2022.06.25