Algorithm/Baekjoon
[Swift] 11725 - 트리의 부모 찾기
내일은개발천재🎵
2023. 3. 14. 06:37
11725 트리의 부모 찾기
문제 요약
루트 노드가 1인 트리에, 각 노드의 부모 노드 번호를 찾는 문제이다.
알고리즘
- 입력을 기반으로 인접 리스트로 만든다.
- 루트 노드(1번노드)부터 BFS를 탐색한다.
- 부모노드를 찾아 출력한다.
- Queue에서 pop 된 노드가 부모 노드이고, 이 노드에서 방문가능한 노드들이 자식 노드가된다.
주어진 입력을 기반으로 인접 리스트로 만들고, BFS를 이용하여 부모 노드를 출려한다.
접근 방법
처음에는 입력받은 즉시 부모 노드를 찾을 수 있지 않나 라고 생각했다. (예제만 보면 그렇다)
더보기
처음 접근했던 방법 ( 틀렸습니다 )
처음에는 굳이 그래프 탐색을 하지 않고 문제를 풀 수 있다고 생각했다.
result라는 배열에 1만 1로 저장하고, 나머지 노드들에 0을 저장한다. (루트노드가 1이므로)
이후 입력받는 숫자 a, b에 대해서 result[a] > result[b] 라면, a가 b의 노드라고 생각할 수 있다. (예제에서는 제대로 출력된다.)
하지만 조금 더 생각하면 완전히 틀린 코드라는 것을 알 수 있다.
예시 코드의 경우 부모노드가 무조건 존재하는 상황밖에 없다. 하지만 다음과 입력을 생각해보자
3
2 3
1 2
이 경우는 2와 3을 봤을 때 result[2], result[3] 모두 0이며, 다음 입력 1, 2을 본 후에 2가 부모노드라는 것을 알 수 있게 된다.
즉, 입력받은 즉시 부모노드를 결정할 수 없다!! -> 다른 방법을 생각해봐야한다.
틀린 코드
let n = Int(readLine()!)!
var visited = [Bool](repeating: false, count: n + 1)
var result = [Int](repeating: 0, count: n + 1)
result[1] = 1
// result가 더 큰 것이 부모노드이다
for _ in 1 ..< n {
let input = readLine()!.split { $0 == " " }.map { Int($0)! }
let (a, b) = result[input[0]] > result[input[1]] ? (input[0], input[1]) : (input[1], input[0])
result[b] = a
}
// 결과를 출력한다
for index in 2...n {
print(result[index])
}
- 입력 받은 값을 기반으로 인접 리스트를 만든다. 이때, 양방향 간선으로 간주하여 작성해야한다. (어떤게 부모인지 모르기 때문에)
- 이후 시작노드 1을 기반으로 그래프 탐색을 수행한다.
- queue 연산을 기준으로 설명하자면
- pop 된 현재 노드 = 부모 노드
- 탐색하며, 아직 방문되지 않아서 다음 queue에 들어가는 노드들 = 자식노드
- queue에 다음 탐색할 노드를 넣을 때, result 배열에 부모노드 값을 저장해주자.
코드
let n = Int(readLine()!)!
var tree = [Int : [Int]]()
Array(1...n).forEach { tree[$0] = [] }
var result = [Int](repeating: 0, count: n + 1)
// 인접리스트로 입력받는다
for _ in 1 ..< n {
let input = readLine()!.split { $0 == " " }.map { Int($0)! }, (a, b) = (input[0], input[1])
tree[a]!.append(b)
tree[b]!.append(a)
}
// 시작노드 1을 기반으로 BFS 탐색을 수행한다.
var queue = [1]
while !queue.isEmpty {
let n = queue.removeFirst()
guard let nodes = tree[n] else { continue }
for i in nodes {
guard result[i] == 0 else { continue }
result[i] = n
queue.append(i)
}
}
for i in 2...n {
print(result[i])
}