반응형
https://www.acmicpc.net/problem/9489
9489번: 사촌
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 노드의 수 n과 사촌의 수를 구해야 하는 노드의 번호 k가 주어진다. (1 ≤ n ≤ 1,000, 1 ≤ k ≤ 1,000,000) 다음 줄
www.acmicpc.net
해결 방법 : 트리
- 조건에 따라 트리를 구성하기만 하면 된다.
- 자식이 최근에 삽입된 노드(cur_p를 index로 갖는 노드)의 마지막 자식 노드 + 1이 현재 number가 아니면, cur_p를 1 증가시켜주기만 하면 된다.
- 사촌 노드는 k의 부모의 부모의 자식들의 자식들이다.
- 단, k의 부모는 예외처리 해주어야 할 것.
import sys
input = sys.stdin.readline
from collections import defaultdict
def solution(n, k, nums):
if k == nums[0]: # root
return 0
answer = 0
T, rT = defaultdict(list), dict() # Tree, reverse_Tree
cur_p = 0 # nums[p] is current parent node
T[None], rT[nums[cur_p]] = [nums[cur_p]], None
for i in range(1, n): # Initialize Tree
if T[nums[cur_p]] != []:
if nums[i] != T[nums[cur_p]][-1] + 1:
cur_p += 1
T[nums[cur_p]].append(nums[i])
rT[nums[i]] = nums[cur_p]
for p in T[rT[rT[k]]]:
if p != rT[k]:
answer += len(T[p])
return answer
if __name__ == '__main__':
while True:
n, k = map(int, input().split())
if n == 0: break
nums = list(map(int, input().split()))
result = solution(n, k, nums)
print(result)반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
| 백준 1305 : 광고 (0) | 2021.07.24 |
|---|---|
| 백준 1071 : 소트 (0) | 2021.07.23 |
| 백준 2696 : 중앙값 구하기 (0) | 2021.07.18 |
| 프로그래머스 - 중력 작용 (0) | 2021.07.17 |
| 프로그래머스 : N으로 표현 (0) | 2021.06.30 |