๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ | ๋ฐฑ์ค€/๐Ÿ˜ | Gold

[Kotlin, G5] ๋ฐฑ์ค€ 16928๋ฒˆ ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„

by immgga 2024. 8. 12.

์ถœ์ฒ˜: unsplash.com

 

๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„(16928๋ฒˆ)

Gold 5

#๊ทธ๋ž˜ํ”„ ์ด๋ก  #๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ #๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

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

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

1๋ถ€ํ„ฐ 100๋ฒˆ์งธ ์นธ๊นŒ์ง€ ์กด์žฌํ•˜๋Š” ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„ํŒ์ด ์กด์žฌํ•  ๋•Œ, n๊ฐœ์˜ ์‚ฌ๋‹ค๋ฆฌ์™€ m๊ฐœ์˜ ๋ฑ€์ด ์žˆ๋‹ค.

์‚ฌ๋‹ค๋ฆฌ๋ฅผ ๋ฐŸ์œผ๋ฉด ์œ„๋กœ ์ด๋™ํ•˜๊ณ  ๋ฑ€์„ ๋ฐŸ์œผ๋ฉด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

์ž…๋ ฅ ์˜ˆ์ œ 1์„ ์˜ˆ๋กœ ๋“ค๋ฉด

3 7
32 62
42 68
12 98
95 13
97 25
93 37
79 27
75 19
49 47
67 17

์‚ฌ๋‹ค๋ฆฌ๊ฐ€ 3๊ฐœ, ๋ฑ€์ด 7๊ฐœ ์žˆ๊ณ  2๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ๋‹ค๋ฆฌ, ๋ฑ€์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

์ˆซ์ž 2๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ์‚ฌ๋‹ค๋ฆฌ 32 62๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด 32๋ฅผ ๋ฐŸ๊ฒŒ ๋˜๋ฉด 62๋กœ ์ด๋™ํ•˜๊ณ , 4๋ฒˆ์งธ ์ค„์ธ ๋ฑ€ 95 13์˜ ๊ฒฝ์šฐ๋Š” 95๋ฅผ ๋ฐŸ์œผ๋ฉด 13์œผ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

 

์ฃผ์‚ฌ์œ„๋ฅผ ์ ๊ฒŒ ๋Œ๋ฆฌ๋ฉด์„œ ๋ง์„ 100๊นŒ์ง€ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ์ž…๋ ฅ ์˜ˆ์ œ 1์˜ ์ •๋‹ต์€ 3์ด๋‹ค.

1์—์„œ ์‹œ์ž‘ํ•ด 6์œผ๋กœ ๋Œ๋ ค 7๋กœ ์ด๋™ํ•˜๊ณ  5๋ฅผ ๋Œ๋ ค 12๋กœ ์ด๋™ํ•˜๋ฉด 98๋กœ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ํƒ€๊ณ  ์ด๋™ํ•œ๋‹ค. 2๋ฅผ ๋Œ๋ฆฌ๋ฉด 100์— ๋„๋‹ฌํ•œ๋‹ค.

1 -> 7 -> 98 -> 100์˜ ์ˆœ์„œ๋กœ ์ฃผ์‚ฌ์œ„๋ฅผ 3๋ฒˆ ๋Œ๋ฆฌ๋ฉด 100์— ๋„๋‹ฌํ•œ๋‹ค.

 

์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ์ฃผ์‚ฌ์œ„๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์„œ ๊ฐ€์žฅ ๋จผ์ € 100์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ œ์ผ ๋น ๋ฅธ(์ตœ์†Ÿ๊ฐ’) ๊ฒฝ์šฐ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ ์œ„์น˜๋Š” ์ฒ˜์Œ์—๋Š” 1๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด์ œ 1์—์„œ 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ์ฃผ์‚ฌ์œ„๋ฅผ ๋Œ๋ ค ๊ฐ€๋ฉด์„œ ์›€์ง์ธ ๊ฐ’์— ๋ฑ€ ๋˜๋Š” ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฑ€ ๋˜๋Š” ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ๋งž๊ฒŒ ๋ง์„ ์ถ”๊ฐ€๋กœ ์ด๋™ํ•œ๋‹ค.

์ด๋™์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค. ๋‹ค์‹œ ๊ทธ ๋•…์„ ๋‹ค์‹œ ๋ฐŸ๊ฒŒ ๋˜์—ˆ์„ ๋•Œ๋Š” ์ฒ˜์Œ์— ๋ฐŸ์•˜๋˜ ๊ฒฝ์šฐ๋ณด๋‹ค ๋” ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ”„๋กœ์„ธ์Šค ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œ๋กœ ๊ตฌ์„ฑํ•ด ๋ณด์•˜๋‹ค.

์ดˆ๊ธฐ 1์€ ์ฃผ์‚ฌ์œ„๋ฅผ 0๋ฒˆ ๊ตด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— move๊ฐ€ 0์ด๋‹ค. 1์—์„œ ์ฃผ์‚ฌ์œ„๋ฅผ 1๋ถ€ํ„ฐ 6์„ ๊ตด๋ฆฌ๋Š” ๊ฒฐ๊ณผ๊ฐ€ 2, 3, 4, 5, 6, 7์—๋Š” move๋ฅผ 1๋กœ ์„ค์ •ํ•œ๋‹ค. ๋˜‘๊ฐ™์ด 8, 9, 10, 11, 12, 13์—๋„ ์ด์ „๊ณผ ๊ฐ™์ด move๋ฅผ 2๋กœ ์„ค์ •ํ•œ๋‹ค.

12๋ฒˆ์งธ ์นธ์— 98๋กœ ํ–ฅํ•˜๋Š” ์‚ฌ๋‹ค๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 98๋กœ ์ด๋™ํ•œ๋‹ค. ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ์ง€ ์•Š๊ณ  98๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— move๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ œ 98์—์„œ 99, 100์„ ์ฃผ์‚ฌ์œ„๋ฅผ 1๋ฒˆ ๋” ๊ตด๋ ค์„œ(move: 3) ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 100์— ๋„๋‹ฌํ–ˆ์œผ๋ฏ€๋กœ 3์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

private val ladderSnake = mutableMapOf<Int, Int>()
private val visited = BooleanArray(101)
private var result = 0

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (ladder, snake) = readLine().split(" ").map { it.toInt() }

    for (i in 1 .. ladder) {
        val (ladderStart, ladderEnd) = readLine().split(" ").map { it.toInt() }
        ladderSnake[ladderStart] = ladderEnd
    }

    for (i in 1 .. snake) {
        val (snakeStart, snakeEnd) = readLine().split(" ").map { it.toInt() }
        ladderSnake[snakeStart] = snakeEnd
    }

    bfs()

    println(result)
}

private fun bfs() {
    val queue = ArrayDeque<List<Int>>()
    queue.addFirst(listOf(1, 0))     // ํ˜„์žฌ ์œ„์น˜, ์›€์ง์ธ ํšŸ์ˆ˜
    visited[1] = true

    while (queue.isNotEmpty()) {
        val data = queue.removeLast()
        val locate = data.first()
        val move = data.last()

        if (locate >= 100) {
            result = move
            return
        }

        for (m in 1 .. 6) {
            val location = locate + m

            if (location > 100) continue
            if (visited[location]) continue

            if (ladderSnake.containsKey(location)) {
                queue.addFirst(listOf(ladderSnake[location]!!, move + 1))
                visited[ladderSnake[location]!!] = true
            } else {
                queue.addFirst(listOf(location, move + 1))
                visited[location] = true
            }
        }
    }
}

 

๋ฌธ์ œ ํ’€์ด

์‚ฌ๋‹ค๋ฆฌ์™€ ๋ฑ€์„ ์ €์žฅํ•  map์„ ์ƒ์„ฑํ•œ๋‹ค. key๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์นธ์ด๊ณ , value๋ฅผ ์ด๋™๋˜๋Š” ์นธ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

visited๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

 

ladderSnake์— ladder์™€ snake๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ €์žฅํ•ด ์ค€๋‹ค.

๊ทธ๋‹ค์Œ bfs๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

bfs์—๋Š” queue๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

queue๋ฅผ arrayDeque๋ฅผ ์‚ฌ์šฉํ•ด์„œ move๊ฐ€ ์ ์€ ์ˆœ์œผ๋กœ ๋จผ์ € ์ž‘๋™ํ•˜๋„๋ก ํ•ด์ค€๋‹ค.

arrayDeque์—๋Š” list๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ, ํ˜„์žฌ ์žˆ๋Š” ์นธ์˜ ์œ„์ง€, ์›€์ง์ธ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

์ดˆ๊ธฐ์—๋Š” 1๋ฒˆ์งธ ์นธ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์นธ์„ 1๋กœ, ์›€์ง์ธ ํšŸ์ˆ˜๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  1๋ฒˆ visited๋ฅผ ์ฒดํฌํ•œ๋‹ค.

 

queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋ฐ˜๋ณต๋ฌธ์—๋Š” ์ฃผ์‚ฌ์œ„๋ฅผ 1๋ถ€ํ„ฐ 6๊นŒ์ง€ ๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•œ๋‹ค.

์ฃผ์‚ฌ์œ„๋ฅผ ๋Œ๋ ค ์›€์ง์ธ ์œ„์น˜๋ฅผ location์— ์ €์žฅํ•˜๊ณ  visited์˜ location๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋ฐ์ดํ„ฐ์ด๋ฉด ๋„˜์–ด๊ฐ„๋‹ค. ๋˜ํ•œ location์ด 100์ด ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด visited๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค(visited์˜ size๊ฐ€ 101์ด๋‹ค).

 

location์ด ladderSnake์˜ ์‹œ์ž‘ ์นธ์— ๋“ค์–ด๊ฐ€๋ฉด value์˜ ์นธ์œผ๋กœ ์ด๋™์‹œํ‚จ ๊ฒฐ๊ณผ๋ฅผ queue์— ๋‹ด์•„ ์ค€๋‹ค.

์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” location์„ queue์— ๋„ฃ์–ด ์ค€๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ตณ์ด List๋ฅผ ๋งŒ๋“ค์–ด ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

๊ธฐ์กด์˜ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋•Œ๋Š” graph List๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ์—๋Š” ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

queue์— ํ˜„์žฌ ์นธ์— ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋กœ์ง ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ์— ํƒ€ ๋ธ”๋กœ๊ทธ์˜ ํ•ด์„ค ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

728x90