본문 바로가기

개발/알고리즘

[백준] BFS - 7576번 토마토

반응형
 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

입력 & 출력

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다.
보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다.
철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다.
정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

 

풀이

BFS 문제로, 익지 않은 토마토(0)을 탐색하며 각 칸에 도착하기 위한 최소 거리를 구한다. 
모든 칸을 돌았으나 익지 않은 토마토가 있을 경우, -1을 출력한다.

이 여부는 전체 개수를 구한 후 토마토가 없는 경우와 익은 토마토의 개수를 빼어 Total 로 선언한다.
Queue에 담긴 토마토를 뺄 때마다 Total 값을 1씩 빼어 모든 칸을 돌고 난 후 Total 이 0이면 모든 토마토가 익었다는 것으로 간주한다.

Swift 전체 코드

    let num = readLine()!
    let width = Int("\(num.first!)")!
    let height = Int("\(num.last!)")!
    
    var box : [[Int]] = .init(repeating: [], count: height)
    var queue : [(h: Int, w: Int, days: Int)] = []
    
    var total = width * height
    var days = 0
    
    let dx = [-1, 0, 1, 0]
    let dy = [0, -1, 0, 1]
    
    for i in 0..<height {
        let line = readLine()!.split(separator: " ")
        
        for j in 0..<line.count {
            if Int(line[j])! == -1 {
                total -= 1
            } else if Int(line[j])! == 1 {
                queue.append((i,j,days))
            }
            box[i].append(Int(line[j])!)
        }
    }
    
    while !queue.isEmpty {
        let pop = queue.remove(at: 0)
        total -= 1
        
        if pop.days > days {
            days = pop.days
        }
        
        for j in 0...3 {
            let y = pop.w + dx[j]
            let x = pop.h + dy[j]
            
            if x < 0 || x >= height || y < 0 || y >= width {
                continue
            }
            
            if box[x][y] == -1 || box[x][y] == 1  {
                continue
            }
            
            box[x][y] = 1
            queue.append((x,y,days + 1))
        }
    }
    
    print(total != 0 ? -1 : days)

 

 

+ 채점결과 2%의 경우는 시간 초과로 removeFirst() 대신 Queue를 구현해서 사용해야한다. (추후 업데이트)

반응형

'개발 > 알고리즘' 카테고리의 다른 글

[백준] 2581번 소수  (0) 2021.10.05
[백준] BFS - 1697번 숨바꼭질  (0) 2021.10.05
[백준] BFS - 2178번 미로탐색  (0) 2021.09.28
[백준] BFS - 1926번 그림  (0) 2021.08.30
[백준] 그리디 - 1931번 회의실 배정  (0) 2021.04.29