새소식

카테고리 없음

⭐⭐⭐⭐[코드트리] 트리 사촌

  • -

https://www.codetree.ai/missions/9/problems/beard-tree/description

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

문제

증가 수열을 이용하여 트리를 만드는 방법은 다음과 같습니다.

  1. 첫 번째 정수는 트리의 루트 노드입니다.
  2. 다음에 등장하는 연속된 수의 집합은 루트의 자식을 나타냅니다. 이 집합에 포함되는 수의 첫 번째 수는 항상 루트 노드+1보다 큽니다.
  3. 그다음부터는 모든 연속된 수의 집합은 아직 자식이 없는 노드의 자식이 됩니다. 그러한 노드가 여러 가지인 경우에는 가장 작은 수를 가지는 노드의 자식이 됩니다.
  4. 집합은 수가 연속하지 않는 곳에서 구분됩니다.

예를 들어서, 1 3 4 5 8 9 11 이라는 증가 수열이 주어지면, 집합은 1 | 3 4 5 | 8 9 | 11 같은 식으로 구분되고, 루트는 1이 되며, 자식은 3 4 5가 됩니다. 그리고 8 9는 3의 자식이, 11은 4의 자식이 됩니다.

두 노드의 부모가 다르지만, 두 부모가 형제일 때, 두 노드를 사촌이라고 합니다.

특정한 노드 번호가 주어졌을 때, 그 노드의 사촌의 수를 구하는 프로그램을 작성하세요.

 

입력 형식

첫 번째 줄에 노드의 수 n과 사촌을 구해야 하는 노드의 번호 k가 주어집니다.

두 번째 줄에 총 n개의 수열의 원소가 주어지며, 모든 수는 1보다 크거나 같고, 1,000,000보다 작거나 같습니다.

입력으로 주어지는 수열은 항상 증가하며 k는 항상 수열에 포함되어있는 수입니다.

  • 1 ≤ n ≤ 1,000
  • 1 ≤ k ≤ 1,000,000

출력 형식

첫 번째 줄에 k의 사촌의 수를 출력합니다.

 

입출력 예제

예제1

입력:

10 15
1 3 4 5 8 9 15 30 31 32

 

출력:

5

 


포인트는 부모의 노드 번호는 다르지만 부모의 부모 노드 번호가 동일하면 서로 사촌이다.

 

1. 규칙에 맞추어 노드별 부모 노드의 번호를 결정한다 

-> 연속되는거 

2. 사촌의 정의를 잘 내린다. 

 

1, 3, 4, 5, 8, 9, 15, 30, 31, 32 노드들은 

0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4 부모 노드 index 번호로 매핑된다. 

 

import sys


if __name__=="__main__":

    # 변수 선언 및 입력:
    n, k = tuple(map(int, input().split()))
    par = [0] * (n + 1)
    
    ans = 0

    target_node_index = 0
    nodes = [0] + list(map(int, input().split()))
    for index in range(1, n + 1):
        if nodes[index] == k: 
            target_node_index = index

    # n개의 원소를 바탕으로 트리를 만들어줍니다.
    parent_node = 0
    for index in range(2, n + 1):
        if nodes[index] > nodes[index-1] + 1:
            parent_node += 1
        
        par[index] = parent_node

    for cur_node in range(1, n + 1):
        # cur_node의 부모의 부모 노드가 존재하지 않는 경우에는 패스
        if not par[par[cur_node]] or not par[par[target_node_index]]:
            continue
        
        # 부모 노드는 다르면서 and 부모의 부모 노드가 같은 경우를 찾습니다.
        if par[cur_node] != par[target_node_index] and par[par[cur_node]] == par[par[target_node_index]]:
            ans += 1        # 해당 노드들은 사촌이 됩니다.

    # 사촌 노드의 개수를 출력합니다.
    print(ans)
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.