Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[Swift] BOJ 1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ” ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[Swift] BOJ 1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2022. 4. 3. 18:42

BOJ 1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

 

โœ… ์˜ค ์ผ๋‹จ ๋ฌธ์ œ ์ด๋ฆ„์ด ์ •๋ง ๋ง˜์— ๋“ ๋‹ค.

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

 

์ผ๋‹จ ํ’€๊ธด ํ’€์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„์€ 1์‹œ๊ฐ„ ๊ฑธ๋ฆผ.

์ด์œ ๋Š” count๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋‚ด ๋…ผ๋ฆฌ์ƒ while์„ ํƒˆ์ถœํ•œ๋‹ค๋ฉด queue๊ฐ€ ๋น„๋ฉด์„œ ํ•˜๋‚˜์˜ ๋ธ”๋Ÿญ(๊ทธ๋ฃน)์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ๋ง๋กœ ์ดํ•ดํ•˜๋Š”๋ฐ, ๊ทผ๋ฐ visited ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์—์„œ ์ข€ ๊ผฌ์ธ๊ฒŒ ์žˆ์—ˆ๋‚˜๋ด„.

 

ํ’€์—ˆ์œผ๋‹ˆ๊นŒ ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ฆฌ๋ทฐ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„์„œ ๋ฆฌ๋ทฐํ•จ.

 

โœ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ๋ฒ•.์šฐ์„  ๋ฏธ๋กœ ์ฐพ๊ธฐ ๋ฌธ์ œ์™€ ๋‹ค๋ฅด๊ฒŒ ์–˜๋Š” ์–ด๋””๊ฐ€ ์‹œ์ž‘ ํฌ์ธํŠธ๊ฐ€ ๋˜๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†์Œ.๊ทธ๋ž˜์„œ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ 1์ด ์–ด๋””์žˆ๋Š”์ง€ ์ฐพ๊ณ ์ž ํ•จ.๊ทธ๋ฆฌ๊ณ  1์„ ์ฐพ์œผ๋ฉด ๊ทธ ์œ„์น˜์—์„œ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ ์ž ํ–ˆ์Œ.

 

while์„ ํƒˆ์ถœํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์ฆ‰, BFS๋ฅผ ์ ์šฉํ•˜์—ฌ  ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ–ˆ์„ ๋•Œ,์ด๋™ํ•  ์žฅ์†Œ๊ฐ€ ์—†๋‹ค๋Š” ๋”์ด์ƒ ์—†๋‹ค๋Š” ๋ง์ž„.

์ด๋™ํ•  ์žฅ์†Œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์นด์šดํŠธ๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆฐ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ 1์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.

์—ฌ๊ธฐ์„œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋ธ”๋Ÿญ์— ์†ํ•œ 1์ด๋ฉด visited๋ฅผ true๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋‘์–ด์„œ ๊ณ„์‚ฐ์„ ๋‹ค์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.

 

โœ… ์ฝ”๋“œ

์ œ์ถœํ•  ๋•Œ๋Š” run๋ฉ”์†Œ๋“œ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ์ œ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

์ฃผ์„ ์ž˜ ๋‹ฌ์•„ ๋‘์–ด์„œ ํ๋ฆ„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ๊ผญ ๋‹ค์‹œ๋ณด์ž!!!!

//https://www.acmicpc.net/problem/1012
import Foundation

struct b1012 {
    static func run() {
        // Input ์ฒ˜๋ฆฌ
        let n = Int(readLine()!)!
        var answer = [Int]()
        
        for _ in 0..<n { // ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ for๋ฌธ์œผ๋กœ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ •ํ•œ๋‹ค.
            let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
            
            var matrix = [[Int]](repeating: [Int](repeating: 0, count: input[1]), count: input[0])
            var visited = [[Bool]](repeating: [Bool](repeating: false, count: input[1]), count: input[0])
            
            for _ in 0..<input[2] {
                let line = readLine()!.split(separator: " ").map{ Int(String($0))! }
                matrix[line[0]][line[1]] = 1
            }
            
            // ์ƒํ•˜์ขŒ์šฐ
            let dx = [-1, 1, 0, 0]
            let dy = [0, 0, -1, 1]
            
            var queue = [[Int]]()
            var count = 0 // ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
            
            for i in 0..<input[0] { // ํ–‰์šฐ์„  ๋ฐ˜๋ณต
                for j in 0..<input[1] { // ์—ด์šฐ์„  ๋ฐ˜๋ณต
                    
                    if matrix[i][j] == 1 && visited[i][j] == false { // ๊ทธ ํ–‰์˜ ๊ฐ’์ด 1์ด๊ณ , ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด
                        // BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฑ„ํƒํ•จ
                        queue.append([i,j]) // queue์— ๋„ฃ๋Š”๋‹ค
                        
                        while !queue.isEmpty { // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ง€์†์ ์œผ๋กœ ์ˆ˜ํ–‰.
                            // ํ์˜ ์ œ์ผ ์•ž์˜ ๊ฐ’์„ ๋นผ๋‚ธ๋‹ค.
                            let x = queue[0][0]
                            let y = queue[0][1]
                            
                            queue.removeFirst()
                            
                            for i in 0..<4 { // ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋ˆ๋‹ค.
                                // ํ์—์„œ ๊บผ๋‚ธ ๊ธฐ์ค€๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ •ํ•ด์„œ ํƒ์ƒ‰ํ•œ๋‹ค.
                                let nx = x + dx[i]
                                let ny = y + dy[i]
                                
                                // matrix์•ˆ์— index๊ฐ€ ์œ„์น˜ํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ์  ์—†๋Š” ์œ„์น˜๋ผ๋ฉด
                                if nx >= 0 && ny >= 0 && nx < input[0] && ny < input[1] && visited[nx][ny] == false {
                                    
                                    if matrix[nx][ny] == 1 { // ๊ทธ ์œ„์น˜์˜ ๊ฐ’์ด 1์ด๋ผ๋ฉด
                                        queue.append([nx, ny]) // ํ์— ๋„ฃ๊ณ 
                                        visited[nx][ny] = true // ๊ฐ’์ด 1์ธ ์—ฌ๊ธฐ๋Š” ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์ฒ˜๋ฆฌ
                                        /* (์ฃผ์˜)
                                         ๋ชจ๋“  ๊ณณ์„ visited์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  1๋กœ ์ •ํ•ด์ง„ ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๋ฉด ๋˜๋ฏ€๋กœ
                                         1์ธ ์œ„์น˜๊ฐ€ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€๋งŒ ์ฒดํฌํ•จ.
                                         */
                                    }
                                }
                            } // for
                        } // while
                        
                        count += 1 // while๋ฌธ์„ ํƒˆ์ถœํ–ˆ๋‹ค๋Š” ๊ฑด, ์—ฐ์†์ ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์•„ ํ•˜๋‚˜์˜ ๋ธ”๋Ÿญ์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์ด๋•Œ ์นด์šดํŒ…
                    }
                }
            }
            answer.append(count)
        }
        answer.forEach {
            print($0)
        }
    }
}
Comments