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
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 1922번: 네트워크 연결 (0) | 2022.07.22 |
---|---|
[백준/BOJ] 12931번: 두 배 더하기 (0) | 2022.07.20 |
[백준/BOJ] 7562번: 나이트의 이동 (0) | 2022.07.17 |
[백준/BOJ] 2247번: 숨바꼭질 4 (0) | 2022.07.17 |
[백준/BOJ] 2468번: 안전 영역 (0) | 2022.07.15 |
댓글