ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 16234 인구 이동
    Algorithm/BOJ 2021. 4. 8. 11:46
    728x90

    출처: www.acmicpc.net/problem/16234

    분류: BFS, DFS


    접근방식

    BFS 또는 DFS로 해결할 수 있는 문제였습니다.

    주어진 범위에 해당하는 칸들을 탐색하고 그룹짓고를 반복하면 됩니다.

    저는 BFS를 사용했는데요, 탐색하면서 멤버들의 따로 저장해뒀다가 탐색이 끝나기 전에 tempMap에 결과를 기록해두고

    전체를 다 돌고 temp와 map을 비교해서 다시 해야할지 말지를 결정해주면서 카운트했습니다.

     

     

    해결방법

    struct Point {
        var r: Int
        var c: Int
        
        init(_ r: Int, _ c: Int) {
            self.r = r
            self.c = c
        }
        
        var nexts: [Point] {
            return [
                Point(r+1, c),
                Point(r-1, c),
                Point(r, c+1),
                Point(r, c-1)
            ]
        }
    }
    
    let nlr = readLine()!.split(separator: " ").map { Int(String($0))! }
    var map = [[Int]]()
    for _ in 0..<nlr[0] {
        map.append(readLine()!.split(separator: " ").map { Int(String($0))! })
    }
    
    let range = nlr[1]...nlr[2]
    var union = 0
    var visited = [[Bool]]()
    var tempMap = [[Int]]()
    
    func setParty(_ p: Point) {
        var queue: [Point] = [p]
        visited[p.r][p.c] = true
        var sum = map[p.r][p.c]
        var partyCount = 1
        var member = [Point]()
        
        while !queue.isEmpty {
            let curr = queue.removeFirst()
            member.append(curr)
            
            for next in curr.nexts where 0..<nlr[0] ~= next.r && 0..<nlr[0] ~= next.c {
                guard !visited[next.r][next.c] else { continue }
                if range ~= abs(map[curr.r][curr.c] - map[next.r][next.c]) {
                    visited[next.r][next.c] = true
                    queue.append(next)
                    sum += map[next.r][next.c]
                    partyCount += 1
                }
            }
        }
        
        for p in member {
            tempMap[p.r][p.c] = sum / partyCount
        }
    }
    
    while true {
        visited = [[Bool]](repeating: [Bool](repeating: false, count: nlr[0]), count: nlr[0])
        tempMap = map
        
        for r in 0..<nlr[0] {
            for c in 0..<nlr[0] {
                guard !visited[r][c] else { continue }
                setParty(Point(r, c))
            }
        }
        
        if tempMap == map {
            break
        } else {
            union += 1
            map = tempMap
        }
    }
    
    print(union)

     

    배운점

    어렵지 않은 문제였는데 구현 과정에서 생각보다 시간이 쪼끔 걸렸다... 

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 11000 강의실 배정  (0) 2021.04.08
    백준 2042 구간 합 구하기  (0) 2021.04.08
    백준 1202 보석 도둑  (0) 2021.04.07
    백준 1715 카드 정렬하기  (0) 2021.04.07
    백준 11404 플로이드  (0) 2021.04.07

    댓글

Designed by Tistory.