반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 코딩테스트
- level2
- programmers
- DP
- 스택
- 딕셔너리
- N과M
- level0
- 그리디
- BOJ
- python
- 프로그래머스
- BFS
- 운영체제
- 구현
- 다익스트라
- 힙
- 가상메모리 관리
- 재귀
- 에라스토테네스의 체
- MYSQL
- 가상메모리
- 다이나믹 프로그래밍
- dfs
- level3
- 백준
- 파이썬
- 브루트포스
- level1
- 수학
Archives
- Today
- Total
동캄의 코딩도장
백준 15681 [트리와 쿼리] 파이썬 본문
반응형
https://www.acmicpc.net/problem/15681
# 백준 15681 트리와 쿼리
import sys
sys.setrecursionlimit(10**6)
#초기화
N,R,Q=map(int,sys.stdin.readline().split()) #입력값 받음
Prev_Tree=[[] for _ in range(N+1)] # 순서 없이 저장할 Tree
Prev_Visted=[0]*(N+1) # 순서 정하기 전 방문처리위한 List
Tree=[[] for _ in range(N+1)] # 순서 정하여(부모-자식 관계) 저장할 Tree
q=[]
ans=[0]*(N+1)
#양방향 연결
q.append(R)
Prev_Visted[R]=1
for _ in range(N-1):
U,V=map(int,sys.stdin.readline().split())
Prev_Tree[U].append(V)
Prev_Tree[V].append(U)
# 단방향 연결을 위한 탐색 --> 트리 생성
while(q):
node=q.pop(0)
for neighborhood in Prev_Tree[node]:
if Prev_Visted[neighborhood]==0:
Tree[node].append(neighborhood)
Prev_Visted[neighborhood]=1
q.append(neighborhood)
# 트리 순회
def visit_child(node):
cnt=1
for child in Tree[node]:
cnt+=visit_child(child)
ans[node]=cnt
return cnt
visit_child(R)
for _ in range(Q):
print(ans[int(sys.stdin.readline())])
문제를 부분적으로 나누어 풀었다.
트리 순회 파트를 한번에 계산하지 않고, 입력이 들어왔을때마다 계산하는 방식으로 했더니 시간초과가 발생했었다.
(아래 해당코드)
for _ in range(Q):
ans=0
query_node=int(sys.stdin.readline())
q.append(query_node)
while(q):
node=q.pop(0)
ans+=1
for child in Tree[node]:
q.append(child)
print(ans)
다른 분의 풀이를 첨부한다. 한번에 계산해도 되는것이었다....! (안타까운 일입니다.)
import sys
sys.setrecursionlimit(1000000000) #반복제한 늘리기
N,R,Q=map(int,sys.stdin.readline().split(' '))
m=[[]for _ in range(N+1)]
visit=[-1 for _ in range(N+1)]
for _ in range(N-1):
a,b=map(int,sys.stdin.readline().split(' '))
m[a].append(b)
m[b].append(a)
def dfs(now):
global visit
visit[now]=1#나 자신을 추가해준다
for i in m[now]:
if visit[i]==-1: #방문하지 않은 방문 가능 노드가 있다면
visit[now]+=dfs(i) #방문하며 그 노드의 서브트리 개수를 더해준다
return visit[now] #내 서브트리 개수를 리턴한다
dfs(R)
for _ in range(Q):
get=int(sys.stdin.readline())
print(visit[get])
https://velog.io/@zjvlzld/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EB%B0%B1%EC%A4%80-15681
(알고리즘)백준 15681 python 파이썬
문제 먼저 문제를 살펴보자 https://www.acmicpc.net/problem/15681 문제 간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자. 정점 U를 루트로 하는 서브
velog.io
<출처>
반응형