ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1717 집합의 표현
    Algorithm/BOJ 2021. 1. 12. 12:44
    728x90

    출처: https://www.acmicpc.net/problem/1717

    분류: 자료구조


    접근방식

    몰랐는데 disjoint-set(서로소 집합) 문제라고 하네요.

    집합이 합쳐지는 걸 어떤 집합에 속하게 된다는 개념으로 접근하면 쉽게 해결할 수 있는 문제였습니다.

    배열에는 부모를 저장하고 있고 재귀적으로 최상위 부모를 찾아서 비교하고,
    합칠 때도 역시 최상위 부모로 합쳐주면 됩니다 :)

    처음엔 문제 그대로 집합을 합쳐주고 원소들을 합쳐진 집합으로 다 바꿔주는 식으로.... 1차원적으로 풀었는데 당연히 시간초과였습니다 흡

    * a와 b를 확인하기 전에 같은 경우를 걸러주면 시간을 많이 줄일 수 있습니다 :)

    해결방법

    import Foundation
    
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    var parents = Array(0...input[0])
    
    func parent(of i: Int) -> Int {
        guard parents[i] != i else { return i }
        parents[i] = parent(of: parents[i])
        return parents[i]
    }
    
    func union(_ a: Int, _ b: Int) {
        let aParent = parent(of: a)
        let bParent = parent(of: b)
        guard aParent != bParent else { return }
        parents[bParent] = aParent
    }
    
    for _ in 0..<input[1] {
        let order = readLine()!.split(separator: " ").map { Int(String($0))! }
        let a = order[1]
        let b = order[2]
        
        if order[0] == 0 {
            guard a != b else { continue }
            union(a, b)
        } else {
            print(parent(of: a) == parent(of: b) ? "YES" : "NO")
        }
    }

    배운점

    또 하나 배워간다. 워낙 유명하고 대표적인 문제 같은데 처음본다; 갈 길이 머~~~~~ㄹ다 

    union에서 parents[bParent]로 해야하는데 그냥 parents[b]로 해서 한 시간을 날려먹었다..... ㅠ

     

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

    백준 1991 트리 순회  (0) 2021.01.13
    백준 1976 여행가자  (0) 2021.01.12
    백준 1927, 11279 최소 최대 힙  (0) 2021.01.11
    백준 3190 뱀  (0) 2021.01.09
    백준 13460 구슬 탈출 2  (0) 2020.07.24

    댓글

Designed by Tistory.