김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 깃허브데스크탑
  • 원격저장소
  • GitHubDesktop
  • local저장소
  • ㄱ
  • 로컬저장소
  • Remote저장소
  • KMU_WINK

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[백준1167&파이썬] 트리의 지름을 BFS를 사용해 구하자. 트리는 사이클이 존재하지 않는다.
•알고리즘(Algorithm )/문제풀이

[백준1167&파이썬] 트리의 지름을 BFS를 사용해 구하자. 트리는 사이클이 존재하지 않는다.

2023. 5. 25. 14:05

# 문제

백준 1167 트리의 지름 파이썬 풀이

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

# 코드

import sys
from collections import defaultdict
from collections import deque

# 정점의 개수
V = int(sys.stdin.readline().strip())
trees = defaultdict(list)

for _ in range(V) :
  line = list(map(int,sys.stdin.readline().split()))

  node = line[0]
  loop_idx = 1
  while loop_idx < len(line)-1 :
    trees[node].append((line[loop_idx], line[loop_idx+1]))
    loop_idx+=2

# 현재 트리는 양방향 연결인 점에 주의
# 무작위 한 정점에서 가장 거리가 먼 곳을 찾는다.
  # 이번엔 BFS를 이용해서 찾아보자.
  # 트리는 애초에 사이클이 없다.

# 시작노드로부터 멀리 떨어진 노드를 찾는다.
def bfs(start) :
  global trees, V

  dq = deque()
  visit = [-1] * (V+1)
  visit[start] = 0
  dq.append((start,0))

  while len(dq) != 0 :
    cur_node, cur_weight = dq.popleft()
    for next_node, next_wieght in trees[cur_node] :
      if visit[next_node] == -1 :
        visit[next_node] = cur_weight + next_wieght
        dq.append((next_node,visit[next_node]))

  return visit

distance = bfs(1)
print(max(bfs(distance.index(max(distance)))))

# 풀이

  • 똑같은 문제가 백준 1967에 있고 어제 해당 문제를 풀었다.
  • 두 문제의 차이점은 입력 방시에 대한 차이이다.
  • 입력을 파이썬을 푸는 사람 입장에서는 다소 불친절하게 주기 때문에 입력을 잘 받아주자.
  • 예제의 입력에 대한 트리를 구성하면 아래와 같다.

  • 트리의 지름을 구하기 위해서는 한 정점에서 시작하여 가장 먼 곧을 찾는다. 그리고 그 곧은 리프노드가 되며 지름을 이루는 한 끝점이 된다.
  • 이어서 해당 끝점에서 가장 먼 정점을 찾고 그 정점까지의 거리가 트리의 지름이 된다.
  • 트리는 사이클이 존재하지 않는다는 점에서 BFS로 쉽게 구현이 가능했다. 저번에는 다익스트라로 풀었는데 BFS가 더 좋은 풀이인거 같다.

 

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준2263&파이썬] 분할정복을 이용해 트리의 preorder 구하기  (1) 2023.05.28
[백준11660&파이썬] 누적합을 구하는 기본문제  (0) 2023.05.26
[백준1967&파이썬] 트리의 지름을 다익스트라를 이용해 구하자  (0) 2023.05.25
[백준1629&파이썬] 파이썬을 이용해 빠른 거듭제곱 구하기, Fast Computing Power  (0) 2023.05.23
[백준17144&파이썬] 시계 또는 반시계 방향으로 배열원소 회전하기 , 탐색 후 일괄업데이트  (0) 2023.05.20
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준2263&파이썬] 분할정복을 이용해 트리의 preorder 구하기
    • [백준11660&파이썬] 누적합을 구하는 기본문제
    • [백준1967&파이썬] 트리의 지름을 다익스트라를 이용해 구하자
    • [백준1629&파이썬] 파이썬을 이용해 빠른 거듭제곱 구하기, Fast Computing Power
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바