[Python] 1855번 영준이의 진짜 BFS

2025. 12. 14. 01:40·coding test/SW Expert Academy

문제 링크

 

성능 요약

메모리: 115,304 KB, 시간: 9,187 ms, 코드길이: 1,210 Bytes

 
from collections import deque
 
# 큐 순서 정하기
def bfs(x):
    lst=[x]
    queue=deque()
    queue.append(x)
 
    while queue:
        q=queue.popleft()
        for nq in child[q]:
            lst.append(nq)
            queue.append(nq)
 
    return lst        
 
def cal_depth():
    queue=deque()
    queue.append(1)
    d[1]=0
 
    while queue:
        x=queue.popleft()
        for y in child[x]:
            d[y]=d[x]+1
            queue.append(y)
 
def lca(a,b):
    # 깊이 맞추기
    while d[a]!=d[b]:
        if d[a]>d[b]:
            a=parent[a]
        else:
            b=parent[b]
     
    # 공통 조상 찾기
    while a!=b:
        a=parent[a]
        b=parent[b]
 
    return a
 
T=int(input())
for t in range(1,T+1):
    # 1.입력
    N=int(input())
 
    # 2.자료형 정의
    parent=[0,0]+list(map(int,input().split()))
 
    child=[[] for _ in range(N+1)]
    for n in range(1,N+1):
        child[parent[n]].append(n)
 
    d=[0]*(N+1) # 깊이
 
    # 3.동작 알고리즘
    # 1번 노드가 루트
    cal_depth()
    nodes=bfs(1)
 
    ans=0
    for i in range(N-1):
        a=nodes[i]
        b=nodes[i+1]
        sr=lca(a,b) #sub root
        ans+=(d[a]-d[sr])+(d[b]-d[sr])
 
    # 3.출력
    print(f'#{t} {ans}')

 

깊이를 구할 때 DFS를 이용하여 풀었더니 런타임 에러(Runtime Error)가 발생하였다. 이는 DFS 깊이 제한 초과(RecursionError) 때문이다. 그래서 깊이 구하는 방식을 BFS로 바꾸었더니 PASS하였다. 

 

TO DO.

LCA 알고리즘을 이진 리프팅을 통해 개선할 수 있는데 이진 리프팅을 통해 시간과 메모리를 줄인 코드를 보아서, 이진 리프팅으로 LCA 알고리즘을 푸는 연습을 해야겠다.

'coding test > SW Expert Academy' 카테고리의 다른 글

1220. [S/W 문제해결 기본] 5일차 - Magnetic  (0) 2025.05.23
4861. [파이썬 S/W 문제해결 기본] 3일차 - 회문  (0) 2025.05.20
1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드  (0) 2025.05.19
4881. [파이썬 S/W 문제해결 기본] 5일차 - 배열 최소 합  (0) 2025.05.12
5185. [파이썬 S/W 문제해결 구현] 1일차 - 이진수  (0) 2025.05.09
'coding test/SW Expert Academy' 카테고리의 다른 글
  • 1220. [S/W 문제해결 기본] 5일차 - Magnetic
  • 4861. [파이썬 S/W 문제해결 기본] 3일차 - 회문
  • 1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드
  • 4881. [파이썬 S/W 문제해결 기본] 5일차 - 배열 최소 합
wish404
wish404
자동 로그
  • wish404
    wish-log
    wish404
    • 홈
    • 태그
    • 방명록
    • github
    • 분류 전체보기 (75) N
      • log (8)
        • 블로그 관리 (5)
        • 에러 모음 (2)
      • coding test (47)
        • Algorithm (4)
        • Baekjoon (34)
        • SW Expert Academy (6)
        • etc (3)
      • 프로그래밍 언어 (7)
        • JAVA (7)
      • 데이터 엔지니어링 (5)
        • Kafka (0)
        • Spark (4)
        • Airflow (1)
        • Elasticsearch (0)
      • 머신러닝&딥러닝 (3)
        • Kaggle 스터디 (3)
        • 논문 리뷰 (0)
        • MLOps (0)
      • 신입 개발자가 되기까지 (5) N
        • 취준일기 (1)
        • SSAFY (2)
        • 프로젝트 (1) N
        • CS 공부 (1)
  • 인기 글

  • 태그

    플로이드워샬
    틀린문제
    복습해야지
    그리디 알고리즘
    SSAFY
    dfs
    heapq
    dp
    최단 경로
    중위순회
    dijk
    Dijkstra
    전위순회
    BFS
    후위순회
    복습
    그리디
    싸피
    다익스트라
    벨만포드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wish404
[Python] 1855번 영준이의 진짜 BFS
상단으로

티스토리툴바