{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm/BOJ-1967-Python/","result":{"data":{"site":{"siteMetadata":{"title":"hyesungoh","author":"hyesungoh","siteUrl":"https://www.hyesungoh.xyz","comment":{"disqusShortName":"","utterances":"hyesungoh/blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"3d5e0b72-508c-57fe-a16a-22806f62d59e","excerpt":"노드의 수 n과 n-1만큼의 ‘출발지 도착지 거리’를 입력 받는다. 이 때 노드와 노드의 거리가 최대인 일명 ‘트리의 지름’을 출력하는 문제. 첫번째 풀이는 힙을 사용할 때 ‘-가중치’하여 max 힙을 이용하여 루트 1부터 모든 노드까지의 거리를 이용할려 했으나 다시 처음부터 풀기로 하였다. 두번째 풀이는 큐를 이용하여 시작 노드부터 다른 모든 노드들까지의 최대 거리와 최대 거리를 갖는 노드를 반환하는 함수를 작성하여 위 함수를 두번 호출하여 풀었다. 자세한 풀이는 주석에 설명해 놓았다.","html":"<p>노드의 수 n과 n-1만큼의 ‘출발지 도착지 거리’를 입력 받는다. 이 때 노드와 노드의 거리가 최대인 일명 ‘트리의 지름’을 출력하는 문제. 첫번째 풀이는 힙을 사용할 때 ‘-가중치’하여 max 힙을 이용하여 루트 1부터 모든 노드까지의 거리를 이용할려 했으나 다시 처음부터 풀기로 하였다. 두번째 풀이는 큐를 이용하여 시작 노드부터 다른 모든 노드들까지의 최대 거리와 최대 거리를 갖는 노드를 반환하는 함수를 작성하여 위 함수를 두번 호출하여 풀었다. 자세한 풀이는 주석에 설명해 놓았다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># import sys</span>\n<span class=\"token comment\"># import heapq</span>\n<span class=\"token comment\"># INF = sys.maxsize</span>\n\n<span class=\"token comment\"># 다익스트라를 이용하여 1번 노드부터 각 노드까지 가는 거리 중 최대 값을 반환</span>\n\n<span class=\"token comment\"># def dijkstra(graph):</span>\n<span class=\"token comment\">#     q = []</span>\n<span class=\"token comment\">#     dist = [0 for _ in range(len(graph))]</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#     max_val = 0</span>\n<span class=\"token comment\">#     max_index = 0</span>\n<span class=\"token comment\">#     heapq.heappush(q, [0, 0, 1])</span>\n<span class=\"token comment\">#     while q:</span>\n\n        <span class=\"token comment\"># 거리에 -을 붙여 max heapq으로 사용</span>\n<span class=\"token comment\">#         reverse_weight, weight, here = heapq.heappop(q)</span>\n<span class=\"token comment\">#         for there, next_weight in graph[here].items():</span>\n<span class=\"token comment\">#             total_weight = next_weight + weight</span>\n<span class=\"token comment\">#             # dist[there] = max(total_weight, dist[there])</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#             temp_max = max(total_weight, dist[there])</span>\n<span class=\"token comment\">#             if max_val &lt; temp_max:</span>\n<span class=\"token comment\">#                 max_val = temp_max</span>\n<span class=\"token comment\">#                 max_index = there</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#             heapq.heappush(q, [-total_weight, total_weight, there])</span>\n<span class=\"token comment\">#     return max_index</span>\n<span class=\"token comment\">#</span>\n\n<span class=\"token comment\"># 최대 거리를 갖는 노드를 기준으로 계산하는 함수를 작성할려 했으나</span>\n<span class=\"token comment\"># 처음부터 다시 풀기로 함</span>\n\n<span class=\"token comment\"># def diameter(graph, k):</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># n = int(input())</span>\n<span class=\"token comment\"># graph = [{} for _ in range(n+1)]</span>\n<span class=\"token comment\"># for _ in range(n-1):</span>\n<span class=\"token comment\">#     u, v, w = map(int, input().split())</span>\n<span class=\"token comment\">#     if v in graph[u]:</span>\n<span class=\"token comment\">#         graph[u][v] = max(graph[u][v], w)</span>\n<span class=\"token comment\">#     else:</span>\n<span class=\"token comment\">#         graph[u][v] = w</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># print(graph)</span>\n<span class=\"token comment\"># print(dijkstra(graph))</span>\n\n<span class=\"token comment\"># 2번쨰 풀이</span>\n<span class=\"token keyword\">import</span> sys\n<span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> deque\n<span class=\"token builtin\">input</span> <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>stdin<span class=\"token punctuation\">.</span>readline\n\n<span class=\"token comment\"># {1: [[2, 3], [3, 2]], 2: [[4, 2]]}</span>\n<span class=\"token comment\"># {시작점: [[도착지, 거리], [도착지1, 거리1]]}과 같이 그래프 저장</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">dijkstra</span><span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">,</span> start<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 시작점과 거리 0을 큐에 삼입</span>\n    visit <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token comment\"># 방문 확인을 위한 리스트</span>\n    visit<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span> <span class=\"token comment\"># 시작점 방문 확인 처리</span>\n    max_value <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token comment\"># 최대 값을 저장할 변수</span>\n    max_node <span class=\"token operator\">=</span> <span class=\"token number\">0</span> <span class=\"token comment\"># 최대 값을 갖는 노드를 저장할 변수</span>\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        node<span class=\"token punctuation\">,</span> weight <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> max_value <span class=\"token operator\">&lt;</span> weight<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 최대값 갱신 시</span>\n            max_value <span class=\"token operator\">=</span> weight\n            max_node <span class=\"token operator\">=</span> node\n\n        <span class=\"token keyword\">for</span> next_node <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># next_node = [노드, 거리]</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visit<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 방문한 적이 없는 노드일 때</span>\n                visit<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span> <span class=\"token comment\"># 방문 처리</span>\n                <span class=\"token comment\"># 현재 보유 거리와 다음 노드까지의 거리를 합산하여 큐에 추가</span>\n                q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> weight <span class=\"token operator\">+</span> next_node<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># 최대 값을 갖는 노드와 최대 값을 반환</span>\n    <span class=\"token keyword\">return</span> max_node<span class=\"token punctuation\">,</span> max_value\n\nn <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">input</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\ngraph <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># 노드의 수가 1일 때 정답은 0</span>\n<span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    exit<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    u<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> w <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">input</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># 쌍방향으로 저장</span>\n    <span class=\"token keyword\">if</span> u <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">:</span>\n        graph<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        graph<span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> v <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">:</span>\n        graph<span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        graph<span class=\"token punctuation\">[</span>v<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>u<span class=\"token punctuation\">,</span> w<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 루트 1부터 시작 했을 때 최대 값과 그 노드를 저장</span>\nmn<span class=\"token punctuation\">,</span> mv <span class=\"token operator\">=</span> dijkstra<span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 최대 값을 갖는 노드부터 시작하여 최대 값을 출력</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>dijkstra<span class=\"token punctuation\">(</span>graph<span class=\"token punctuation\">,</span> mn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"BOJ-1967 - Python","date":"October 30, 2020"}}},"pageContext":{"slug":"/Algorithm/BOJ-1967-Python/","previous":{"fields":{"slug":"/Algorithm/BOJ-1446-Python/"},"frontmatter":{"title":"BOJ-1446 - Python","category":"Algorithm","draft":false}},"next":{"fields":{"slug":"/Algorithm/BOJ-1167-Python/"},"frontmatter":{"title":"BOJ-1167 - Python","category":"Algorithm","draft":false}}}},"staticQueryHashes":["3128451518","3290666882"]}