본문 바로가기
알고리즘

백준_15957_음악추천(해결 못함)

by 매화of사군자 2020. 2. 14.

https://www.acmicpc.net/problem/15957

 

15957번: 음악 추천

입력의 첫째 줄에는 세 정수로, 곡의 수 N(2 ≤ N ≤ 100,000), 추천 알고리즘의 결과 데이터의 수 K(1 ≤ K ≤ 100,000), 목표 점수 J(10 ≤ J ≤ 108)가 주어진다. 각각의 곡은 1번부터 N번까지 번호가 붙어 있다. 다음 줄에 N-1개의 곡 번호가 주어지는데, 이는 2번 곡부터 해당 곡의 부모 노드가 되는 곡의 번호이다. 1번 곡은 부모 노드가 없다. 다음 줄에 N개의 수가 주어지는데, 이는 1번 곡부터 해당 곡을 부른 가

www.acmicpc.net

해결 방법

> 입력을 받아 트리를 그린다.

> 각 노드의 서브트리의 노드 개수를 구한다.(가중치를 나누기 위함)

> dfs를 돌면서 가중치를 적용시킨다.

> 트리를 순회하면서 가중치가 목표 점수에 도달하면 걸린시간을 체크한다.

 

결과

> 시간 초과

> 내가 생각한 이유 : 노드의 개수가 10만개인데 내가 짠 코드는 dfs를 10만번 돌고 또 돌아야 하기 떄문에 시간초과가 난 것 같다.

 

코드

더보기

import sys

from collections import defaultdict

 

sys.setrecursionlimit(10 ** 6)

 

def DFS_visit(adjuvisited):

    if num_subnode[u] != None:

        return

    visited.append(u)

    for v in adj[u]:

        if v not in visited:

            DFS_visit(adj, v, visited)

 

def DFS(adjs):

    visited =[]

    DFS_visit(adj, s, visited)

    num_subnode[s] = len(visited)

 

def DFS_visit_cal(adjuvisitedtimew):

    visited.append(u)

    index = result[u - 1][2] - 1

    if not check[index]:

        result[u - 1][1] += w

        if (result[u - 1][1] // singer_count[result[u - 1][2]]) >= target_score:

            check[index] = True

            output[result[u - 1][2]] = time

    for v in adj[u]:

        if v not in visited:

            DFS_visit_cal(adj, v, visited, time, w)

 

def DFS_cal(adjstimew):

    visited =[]

    DFS_visit_cal(adj, s, visited, time, w)

 

musictree = defaultdict(set)

num_music, num_data, target_score = map(intinput().split())

parent_node = list(map(intinput().split()))

parent_node.insert(0,0)

 

#가수 처리

singer = list(map(intinput().split()))

singer_count = defaultdict(int)

for i in singer:

    singer_count[i] += 1

 

for i in range(1, num_music + 1):

    for j in range(num_music):

        if parent_node[j] == i:

            musictree[i].add(j + 1)

 

num_subnode = list(None for i in range(num_music + 1))  #서브트리의 노드 개수

for i in range(1, num_music + 1):

    DFS(musictree,i)

 

result = list()

for i in range(num_music):

    result.append([0,0,singer[i]])    #시간, 가중치, 가수

 

check = [False for i in range(num_music)]

output = defaultdict(lambda: -1)

 

for i in range(num_music):

    time, subtree, weight = map(intinput().split())

    DFS_cal(musictree, subtree, time, weight//num_subnode[subtree])

 

for i in singer:

    print(output[i])

댓글