λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’― | λ°±μ€€/πŸ™‚ | Silver

[Kotlin, S1] λ°±μ€€ 2468번 μ•ˆμ „ μ˜μ—­

by immgga 2025. 1. 19.
λ°˜μ‘ν˜•

좜처: unsplash.com

 

μ•ˆμ „ μ˜μ—­(2468번)

Silver 1

#κ·Έλž˜ν”„ 이둠 #브루트포슀 μ•Œκ³ λ¦¬μ¦˜ #κ·Έλž˜ν”„ 탐색 #λ„ˆλΉ„ μš°μ„  탐색 #깊이 μš°μ„  탐색

 

문제 λ‚΄μš©

 

문제 μ ‘κ·Ό

n * n의 μ˜μ—­μ—μ„œ λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λΌμ„œ μž κΈ°λŠ” μ˜μ—­μ΄ μƒκΈ°κ²Œ λœλ‹€.

μ˜μ—­μ΄ 3일 λ•Œ, λΉ„μ˜ 양이 3 이상이면 λͺ¨λ“  μ˜μ—­ 3이 잠기게 λœλ‹€.

 

μ˜μ—­μ˜ κ°œμˆ˜λŠ” μƒν•˜μ’Œμš°μ— λΆ™μ–΄μžˆλŠ” λͺ¨λ“  μ•ˆμ „ μ˜μ—­λ“€μ€ ν•˜λ‚˜λ‘œ κ°„μ£Όν•œλ‹€.

λŒ€κ°μ„ μ˜ μ•ˆμ „ μ˜μ—­μ€ λͺ¨λ‘ λ³„κ°œμ˜ μ•ˆμ „ μ˜μ—­μ΄ λœλ‹€.

 

λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 따라 μž κΈ°λŠ” μ˜μ—­μ˜ μˆ˜κ°€ λ‹¬λΌμ§€κ²Œ 될 것이닀.

물에 μž κΈ°μ§€ μ•Šμ€ μ˜μ—­μ˜ 수의 μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•œλ‹€.

 

λΉ„μ˜ 양은 μ˜μ—­μ—μ„œ κ°€μž₯ μž‘μ€ κ°’μ—μ„œλΆ€ν„° κ°€μž₯ 큰 κ°’κΉŒμ§€ μ •μ˜ν•˜κ³  탐색해 보면 될 거라고 μƒκ°ν•˜κΈ° 쉽닀.

ν•˜μ§€λ§Œ μ˜μ—­μ—μ„œ κ°€μž₯ 큰 κ°’μœΌλ‘œ κ΅¬ν•΄λ΄€μž λͺ¨λ“  μ˜μ—­μ΄ 잠기게 되기 λ•Œλ¬Έμ— ꡳ이 ꡬ할 ν•„μš”λŠ” μ—†κ³ , λΉ„κ°€ μ˜€μ§€ μ•ŠλŠ” κ²½μš°λ„ 있기 λ•Œλ¬Έμ— λΉ„κ°€ μ˜€μ§€ μ•Šμ€ μΌ€μ΄μŠ€μΈ 0λΆ€ν„° μ •μ˜ν•˜κ³  ꡬ해야 ν•  것이닀.

결둠은 λΉ„μ˜ 양은 0λΆ€ν„° 높이 정보 쀑 κ°€μž₯ 큰 κ°’ - 1κΉŒμ§€ λͺ¨λ‘ 확인해 μž κΈ°μ§€ μ•Šμ€ μ˜μ—­μ˜ μ΅œλŒ“κ°’μ„ κ΅¬ν•œλ‹€.

 

문제 ν•΄κ²° μ½”λ“œ

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.max

private var map = arrayOf<List<Int>>()
private var visited = arrayOf(booleanArrayOf())
private val dx = listOf(-1, 1, 0, 0)
private val dy = listOf(0, 0, -1, 1)

fun main() {
    val bf = BufferedReader(InputStreamReader(System.`in`))
    val n = bf.readLine().toInt()
    map = Array(n) { listOf() }
    visited = Array(n) { BooleanArray(n) }

    var maxH = 0
    for (i in 0 until n) {
        val ln = bf.readLine().split(" ").map { it.toInt() }
        map[i] = ln

        maxH = max(maxH, ln.max())
    }

    var answer = 0
    for (h in 0 until maxH) {
        var safeArea = 0

        for (i in visited.indices) {
            visited[i].fill(false)
        }

        for (i in map.indices) {
            for (j in map[i].indices) {
                if (!visited[i][j] && map[i][j] > h) {
                    visited[i][j] = true
                    safeArea++
                    dfs(j, i, h)
                }
            }
        }

        answer = max(answer, safeArea)
    }

    println(answer)
}

private fun dfs(x: Int, y: Int, h: Int) {
    for (i in dx.indices) {
        val mx = dx[i] + x
        val my = dy[i] + y

        if (my in map.indices && mx in map[my].indices) {
            if (!visited[my][mx] && map[my][mx] > h) {
                visited[my][mx] = true
                dfs(mx, my, h)
            }
        }
    }
}

 

문제 풀이

μž…λ ₯λ°›μœΌλ©΄μ„œ κ°€μž₯ 높은 μ˜μ—­μ„ ꡬ해쀀닀.

그리고 dfsλ₯Ό μ΄μš©ν•΄ μΉ¨μˆ˜λ˜μ§€ μ•ŠλŠ” μ˜μ—­μ˜ 개수λ₯Ό ꡬ해쀀닀.

 

λ°˜λ³΅λ¬Έμ„ 톡해 λΉ„μ˜ μ–‘(h)에 λ”°λ₯Έ λͺ¨λ“  caseλ₯Ό κ²€μ‚¬ν•œλ‹€.

μΉ¨μˆ˜λ˜μ§€ μ•Šμ€ μ˜μ—­μ„ κ΅¬ν•˜κ³  λ‚˜λ©΄, answerμ—μ„œ 더 큰 κ°’μœΌλ‘œ λ³€κ²½ν•œλ‹€.

visited 여뢀와 h보닀 높이가 높은지 ν™•μΈν•œλ‹€.

 

 

문제 ν•΄κ²° κ³Όμ •

λΉ„κ°€ μ˜€μ§€ μ•ŠλŠ” 경우λ₯Ό ν™•μΈν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 69%μ—μ„œ WAκ°€ λ‚˜μ™”λ‹€.

κ·Έ μ™Έμ—λŠ” μ–΄λ €μš΄ 점이 μ—†μ—ˆλ‹€.

 

체감 λ‚œμ΄λ„: Silver 1

728x90
λ°˜μ‘ν˜•