์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€] ์ ํ”„ ์ ํ”„ 11060

๊ธฐ๊ฐ€์ •ํ›ˆ 2024. 7. 13. 01:39

 

1. ๋ฌธ์ œ ๋งํฌ

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

๋ฌธ์ œ

์žฌํ™˜์ด๊ฐ€ 1×N ํฌ๊ธฐ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ์นธ์—๋Š” ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์“ฐ์—ฌ ์žˆ๋‹ค. i๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋ฅผ Ai๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ์žฌํ™˜์ด๋Š” Ai์ดํ•˜๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋–จ์–ด์ง„ ์นธ์œผ๋กœ ํ•œ ๋ฒˆ์— ์ ํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ 3์ด๋ฉด, ์žฌํ™˜์ด๋Š” 4, 5, 6๋ฒˆ ์นธ ์ค‘ ํ•˜๋‚˜๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฌํ™˜์ด๋Š” ์ง€๊ธˆ ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ๋์— ์žˆ๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์ตœ์†Œ ๋ช‡ ๋ฒˆ ์ ํ”„๋ฅผ ํ•ด์•ผ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋งŒ์•ฝ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” Ai (0 ≤ Ai ≤ 100)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์žฌํ™˜์ด๊ฐ€ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ์ ํ”„๋ฅผ ํ•ด์•ผ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋ ์นธ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋”๋ณด๊ธฐ
10
1 2 0 1 3 2 1 5 4 2

์ •๋‹ต : 5

2. ์ฝ”๋“œ

let N = Int(readLine()!)!
let maze = readLine()!.split(separator: " ").map{ Int($0)! } // 1xN ๋ฏธ๋กœ ๋งŒ๋“ค๊ธฐ
var visited = Array(repeating: false, count: N)

if N == 1{		// 1x1์ผ์‹œ 0์„ ์ถœ๋ ฅ
    print(0)
}else{
    print(bfs())	// ํƒ์ƒ‰ํ›„ ์ถœ๋ ฅ๊ฐ’ ๋ฐ˜ํ™˜
}

func bfs() -> Int {
    var queue = [(0,0)]		// ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ์—์„œ ์‹œ์ž‘
    visited[0] = true
    while !queue.isEmpty{		
        let current = queue.removeFirst()
        let idx = current.0	// ์„ธํŒ…๋˜์–ด ์žˆ๋Š” maze ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•œ idx ๊ณ„์† ์ฆ๊ฐ€๋˜์–ด์•ผ ํ•จ -> ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ ํ”„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
        let count = current.1	// ์ ํ”„ ํšŸ์ˆ˜ ์ธก์ •

        for i in 0...maze[idx]{	// ๋ฏธ๋กœ ์•ˆ์— 0์˜ ๊ฐ’์ด ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 0๋ถ€ํ„ฐ maze[idx] ํฌํ•จํ•œ ์ ํ”„ํ•˜๊ธฐ
            if N-1 == i+idx{	// i+idx๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋‹ค N-1์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ๋„๋‹ฌํ–ˆ๋‹ค๋Š” ๋œป
                return count + 1// ๋งˆ์ง€๋ง‰ ์ฆ๊ฐ€ํ•˜๊ธฐ
            }
            if !visited[i+idx] && i+idx < N{// ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ , ์ธ๋ฑ์Šค๊ฐ€ ๋ฐฐ์—ด ๋ฒ”์œ„ ์•ˆ์— ํ•ด๋‹นํ•˜๋ฉด
                if maze[i+idx] == 0{// ๋ฏธ๋กœ ์•ˆ์— 0์ด ์žˆ๋‹ค๋ฉด ๋ฌด์‹œํ•˜๊ณ  ๋„˜๊ธฐ๊ธฐ 0์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์—†์Œ
                    continue
                }else{
                    visited[i+idx] = true	// ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
                    queue.append((i+idx,count+1))// ํ์— ์ฆ๊ฐ€ํ•œ ์ธ๋ฑ์Šค, ์ ํ”„ ์ฆ๊ฐ€ ํšŸ์ˆ˜ ๋„ฃ๊ธฐ
                }
            }
            
        }
    }	
    return -1		// 20๋ฒˆ ์ค„์—์„œ ์˜ค๋ฅธ์ชฝ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜์˜€์„๋•Œ -1์„ ๋ฐ˜ํ™˜
}

3. ์ฝ”๋“œ ์„ค๋ช…

BFS๋ฌธ์ œ ํ˜•์‹์ฒ˜๋Ÿผ ํ’€๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์กฐ์‹ฌํ•˜๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.?

( ์ฃผ์„์— ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ฝ”๋“œ ์ด์œ ๋ฅผ ์ ์–ด๋’€...)

 

4. ํ›„๊ธฐ

๊ธฐ์กด์— BFS๋ฌธ์ œ๋ฅผ ๋‚ ๋กœ ๋จน๊ณ  ํ’€์—ˆ์ง€๋งŒ ์ด๋ฒˆ์—” ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์ด์šฉํ•ด์„œ? ์‰ฝ์ง€ ์•Š์•˜๋‹ค ๋งŽ์ด ํ—ท๊ฐˆ๋ฆฌ๊ณ  ๋จธ๋ฆฟ์†์— ๊ผฌ์˜€์Œ