๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ๋‚˜์ดํŠธ์˜ ์ด๋™ BOJ #7562

by seolhee2750 2021. 10. 11.
๋ฌธ์ œ ์„ค๋ช…

์ฒด์ŠคํŒ ์œ„์— ํ•œ ๋‚˜์ดํŠธ๊ฐ€ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค. ๋‚˜์ดํŠธ๋Š” ๋ช‡ ๋ฒˆ ์›€์ง์ด๋ฉด ์ด ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์—๋Š” ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด l(4 ≤ l ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๋Š” l × l์ด๋‹ค. ์ฒด์ŠคํŒ์˜ ๊ฐ ์นธ์€ ๋‘ ์ˆ˜์˜ ์Œ {0, ..., l-1} × {0, ..., l-1}๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ ์ค„๊ณผ ์…‹์งธ ์ค„์—๋Š” ๋‚˜์ดํŠธ๊ฐ€ ํ˜„์žฌ ์žˆ๋Š” ์นธ, ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋‚˜์ดํŠธ๊ฐ€ ์ตœ์†Œ ๋ช‡ ๋ฒˆ๋งŒ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

์ถœ๋ ฅ

5
28
0

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
let cases = Int(readLine()!)!
var dx = [-2, -1, 1, 2, 2, 1, -1, -2], dy = [1, 2, 2, 1, -1, -2, -2, -1] // ๋‚˜์ดํŠธ์˜ ์ด๋™์„ ์œ„ํ•œ ์ขŒํ‘œ๊ฐ’ ๋ณ€ํ™”๋Ÿ‰
var result = [Int]()

// ์ž…๋ ฅ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ ๋งŒํผ ๋ฐ˜๋ณต
for _ in 0..<cases {
    let n = Int(readLine()!)! // ์ฒด์Šค ๋ณด๋“œ ํ•œ ๋ณ€์˜ ๊ธธ์ด
    let start = readLine()!.split(separator: " ").map({Int(String($0))!}) // ์‹œ์ž‘์ 
    let target = readLine()!.split(separator: " ").map({Int(String($0))!}) // ๋ชฉ์ ์ง€
    
    if (start[0], start[1]) == (target[0], target[1]) { result.append(0) } // ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘์ ๊ณผ ๋ชฉ์ ์ง€๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ ๋ฐ”๋กœ result์— 0์ถ”๊ฐ€
    else {
        let target_check = (target[0], target[1]) // ๋ชฉ์ ์ง€๋ฅผ ํŠœํ”Œ๋กœ ์ƒ์„ฑ
        var queue = [(start[0], start[1])] // ํ ์ƒ์„ฑ, ์‹œ์ž‘์ ์„ ํŠœํ”Œ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๊ธฐ
        var board = Array(repeating: Array(repeating: 0, count: n), count: n) // ๊ฒฝ๋กœ๋งˆ๋‹ค ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋ˆ„์ ํ•ด์ฃผ๋ฉด์„œ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ๋ณด๋“œ ๋ฐฐ์—ด
        var arrive = 0 // ๋ชฉ์ ์ง€์— ๋„์ฐฉํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•จ (0์ด๋ฉด ๋„์ฐฉx)
        
        var index = 0
        while !queue.isEmpty {
            let (x, y) = queue[index]
            index += 1
            
            for i in 0..<8 {
                let dx = x + dx[i]
                let dy = y + dy[i]
               
                if dx < 0 || dy < 0 || dx >= n || dy >= n || board[dx][dy] != 0 { continue } // ์˜ˆ์™ธ

                board[dx][dy] = board[x][y] + 1 // ํ•ด๋‹น ์ž๋ฆฌ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ๋ˆ„์ 
                
                if target_check == (dx, dy) { arrive = board[dx][dy]; break } // ํƒ์ƒ‰ํ•œ ์ž๋ฆฌ๊ฐ€ ๋ชฉ์ ์ง€์™€ ๊ฐ™์„ ๊ฒฝ์šฐ
                queue.append((dx, dy)) // ์•„๋‹ ๊ฒฝ์šฐ ํ์— ์ถ”๊ฐ€
            }
            
            if arrive != 0 { result.append(arrive); break } // arrive๊ฐ€ 0์ด ์•„๋‹ ๊ฒฝ์šฐ (๋ชฉ์ ์ง€์— ๋„์ฐฉ)
        }
    }
}

print(result.map({String($0)}).joined(separator: "\n"))

๐Ÿ‘‰ bfs ๋ฌธ์ œ๋กœ, ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์ฃผ๋Š”๊ฒŒ ํฌ์ธํŠธ!

  • ์ง€๊ธˆ๊นŒ์ง€ ํ’€์—ˆ๋˜ bfs ๋ฌธ์ œ๋“ค๊ณผ ์ด ๋ฌธ์ œ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€,
    ๋‚˜์ดํŠธ๋Š” ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰์ด์•„๋‹ˆ๋ผ ์ด 8๊ฐ€์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    ๋”ฐ๋ผ์„œ ๊ทธ์— ๋งž๋Š” ์ขŒํ‘œ ๋ณ€ํ™”๋Ÿ‰์„ ๋„ฃ์–ด์„œ dx, dy ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • ์šฐ์„  if๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘์ ๊ณผ ๋ชฉ์ ์ง€๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ๋ฅผ ์˜ˆ์™ธ๋กœ ๋นผ์ฃผ์—ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” bfs ํƒ์ƒ‰์„ ์‹œ์ž‘ํ–ˆ๋‹ค.
  • while๋ฌธ์œผ๋กœ bfs ํƒ์ƒ‰์„ ํ•ด์ฃผ์—ˆ๊ณ , index ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํ๋ฅผ ๋‹ค๋ค˜๋‹ค.
    ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋Š” ์ด 8๊ฐœ์ด๋ฏ€๋กœ while๋ฌธ ์•ˆ์˜ for๋ฌธ์œผ๋กœ 8๋ฒˆ ๋ฐ˜๋ณตํ•ด์ฃผ์—ˆ๋‹ค.
  • for๋ฌธ์—์„œ๋Š” dx, dy ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ ํƒ์ƒ‰ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๊ทธ ์œ„์น˜๊ฐ€ ์ ์ ˆํ•œ์ง€ ํŒ๋‹จํ–ˆ๋‹ค.
    ๊ทธ ์œ„์น˜๊ฐ€ ๋ณด๋“œ ๋ฐ”๊นฅ์ด๊ฑฐ๋‚˜ ํ•ด๋‹น ์œ„์น˜์— 0์ด ์•„๋‹Œ ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฐ˜๋ณต์€ ์ข…๋ฃŒํ–ˆ๋‹ค.
    (๋ชจ๋“  ๊ฒฝ๋กœ ํƒ์ƒ‰ ์‹œ ํ•ด๋‹น ์ž๋ฆฌ๊นŒ์ง€์˜ ํƒ์ƒ‰ ๋ˆ„์  ์‹œ๊ฐ„์„ ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ, 0์ด ์•„๋‹Œ ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋Š” ๋œป์€ ํ•ด๋‹น ์ž๋ฆฌ๋Š” ์ด๋ฏธ ํƒ์ƒ‰ํ•œ์ ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๋ณต ํƒ์ƒ‰์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•จ!)
    ์˜ˆ์™ธ์ฒ˜๋ฆฌ์—์„œ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ณด๋“œ ๋ฐฐ์—ด์˜ ํ•ด๋‹น ์œ„์น˜์— ๋ˆ„์ ๋œ ์‹œ๊ฐ„์„ ์ €์žฅํ•ด์ฃผ์—ˆ๊ณ ,
    ํƒ์ƒ‰ํ•œ ์ž๋ฆฌ๊ฐ€ ๋ชฉ์ ์ง€์™€ ๊ฐ™์„ ๊ฒฝ์šฐ์—๋Š” arrive ๋ณ€์ˆ˜์— ๋ˆ„์ ๋œ ์‹œ๊ฐ„์„ ๋„ฃ๊ณ  for๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.
    ์•„์ง ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ์— ๋‹ค์Œ ํƒ์ƒ‰์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹คํ–‰์„ ๊ณ„์†ํ•œ๋‹ค.
  • ์œ„์—์„œ arrive ๋ณ€์ˆ˜์— ๋ˆ„์ ๋œ ์‹œ๊ฐ„์ด ์ €์žฅ๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” arrive๊ฐ€ 0์ด ์•„๋‹ˆ๊ฒŒ๋˜๋ฏ€๋กœ
    ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•œ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ , result ๋ฐฐ์—ด์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  while๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ƒํ•˜์ขŒ์šฐ๊ฐ€ ์•„๋‹Œ ์ด 8๊ฐœ ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ์œ„ํ•œ dx, dy ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ๋ ค๊ณ  ํ•œ ๋ถ€๋ถ„์—์„œ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ์ง€์ฒด๋˜์—ˆ๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋“ค๊ณผ ๋น„์Šทํ•ด์„œ ๊ธˆ๋ฐฉ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


๋ฌธ์ œ

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

๋Œ“๊ธ€