PS(Problem Solving)/BOJ

[백준/BOJ] 1245번: 농장 관리

JunsuKim 2022. 7. 18.
728x90

문제

https://www.acmicpc.net/problem/1245

 

1245번: 농장 관리

첫째 줄에 정수 N(1 < N ≤ 100), M(1 < M ≤ 70)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄마다 격자의 높이를 의미하는 M개의 정수가 입력된다. 격자의 높이는 500보다 작거나 같은 음이 아닌 정수

www.acmicpc.net

해설

농장의 산봉우리를 찾아야 한다. 

따라서 전체 탐색을 해줘야 한다.

8방향을 확인하며 자신보다 높은 곳이 있다면 temp를 false로 바꿔준다.

또한 한 지점을 방문할 때마다 방문여부처리를 체크해준다.

자신보다 높은 곳이 없다면, 그 위치가 산봉우리가 된다.

temp가 true라면 봉우리의 갯수를 증가시킨다.

소스 코드

import java.util.*

private lateinit var arr: Array<IntArray>
private lateinit var visited: Array<BooleanArray>
private val dy = intArrayOf(1, 1, 1, -1, -1, -1, 0, 0)
private val dx = intArrayOf(1, 0, -1, 1, 0, -1, 1, -1)
private var temp = true
private var n = 0
private var m = 0

fun main() {
    input()

    var cnt = 0
    repeat(n) { i ->
        repeat(m){ j ->
            if(!visited[i][j]){
                temp = true
                check(i, j)
                if(temp) cnt++
            }
        }
    }
    println(cnt)
}

private fun input() = with(System.`in`.bufferedReader()) {
    var st = StringTokenizer(readLine())
    n = st.nextToken().toInt()
    m = st.nextToken().toInt()

    arr = Array(n) { IntArray(m) }
    visited = Array(n) { BooleanArray(m) }

    repeat(n) { i ->
        st = StringTokenizer(readLine())
        repeat(m) { j ->
            arr[i][j] = st.nextToken().toInt()
        }
    }
}

private fun check(y: Int, x: Int) {
    for(i in 0 until 8) {
        val ny = y + dy[i]
        val nx = x + dx[i]
        if(ny in 0 until n&& nx in 0 until m) {
            if(arr[y][x] < arr[ny][nx]) temp = false
            if(!visited[ny][nx] && arr[y][x] == arr[ny][nx]) {
                visited[ny][nx] = true
                check(ny, nx)
            }
        }
    }
}
728x90

댓글