jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • safari invalid date error
  • JavaScript
  • 가사 검색 자바스크립트
  • 자바스크립트 이벤트 위임
  • 대충만든자판 javascript
  • 카카오 코딩테스트 양궁대회 nodeJS
  • fetch 취소하기
  • 13460 javascript nodejs
  • javascript use strict
  • 외벽 점검 javascript
  • 퀵정렬 자바스크립트
  • 백준 자바스크립트 입력 템플릿
  • 자바스크립트 커링
  • 백준 17406 nodeJS
  • 자바스크립트 채팅방 스크롤
  • 1753 최단경로 javascript
  • 리코쳇 로봇 javascript
  • 계수정렬 자바스크립트
  • safari Date format NaN
  • 프로그래머스 숫자카드나누기 javascript
  • 자바스크립트 sort는 왜 그모양일까
  • 자바스크립트 배열의 특수함
  • 리액트 프로젝트 디버깅하기
  • 억억단을 외우자 javascript
  • 덧칠하기 javascript
  • 병합정렬 자바스크립트
  • 자바스크립트 모듈 시스템
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 25632 소수 부르기 게임
  • 깃 이전 커밋에서 새 브랜치 만들기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 1167번 트리의 지름 - JavaScript(NodeJS)

2021. 6. 3. 13:54

문제

 

1167번: 트리의 지름

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

www.acmicpc.net

풀이

트리의 지름을 구하는 문제이다.


트리의 지름을 구하는 방법

참고 사이트 -> 바로가기

 

해당 포스팅을 참고하면

 

임의의 정점 X에서 가장 먼 정점인 Y를 찾고
찾은 정점 Y에서 가장 먼 정점 Z를 찾는다.
이 Y부터 Z까지의 경로가 트리의 지름이다.

 

트리의 정보를 기반으로 임의의 정점에서 DFS나 BFS를 실행한 결과를 가지고
한번 더 실행해서 트리의 지름을 구해보자.

 

필자는 DFS를 이용하겠다.

 

주의할 점?

입력의 각 행이 "노드 다음노드 가중치 다음노드 가중치 .... -1" 로 주어짐을 유의한다.


방문을 판단하기 위해 체크 배열을 선언하고, 첫 DFS가 끝나면 다시 0으로 초기화한다.
두번째 DFS의 결과에서의 최대 거리 값이 트리의 지름이므로 출력한다.

 

코드는 다음과 같다.

 

코드

const sol = (input) => {
  const N = +input[0];
  input = input.slice(1);
  const tree = Array.from({ length: N + 1 }, () => new Array());

  input.map((str) => {
    const [node, ...nextInfo] = str.split(" ").map(Number);
    for (let i = 0; i < nextInfo.length - 1; i += 2) { 
      tree[node].push([nextInfo[i], nextInfo[i + 1]]);
    } // 각 행의 마지막 요소(-1)를 제외했고 (다음 노드, 거리) 쌍으로 입력을 받는다.
  });

  let check = Array.from({ length: N + 1 }, () => 0);
  let max = { node: 0, dist: Number.MIN_SAFE_INTEGER }; 
  // max 변수에는 최대 거리와 최대 거리인 노드가 들어간다.

  function dfs(node, dist) {
    check[node] = 1;
    if (max.dist < dist) max = {node, dist}; // 거리가 최대거리면 max객체의 노드, 거리 값을 갱신한다.
    for (let [nextNode, nextDist] of tree[node]) {
      if (check[nextNode]) continue;
      dfs(nextNode, dist + nextDist); // 다음 dfs에 거리 값을 더해준다.
    }
  }

  dfs(1, 0); // 임의의 노드(1번 노드 선택)에서 시작해서 첫 dfs를 실행
  max.dist = Number.MIN_SAFE_INTEGER;
  check = new Array(N + 1).fill(0); // check 배열 초기화

  dfs(max.node, 0); // 1번 노드에서의 최대 거리 노드인 max.node에서 시작해서 두번째 dfs 실행
  return max.dist; // 이 최대 거리 값이 실제 트리의 지름에 해당한다.
};

// 백준에서 입력을 받는 코드
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });
저작자표시

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 2529번 부등호 - JavaScript(NodeJS)  (0) 2021.06.04
[백준] 1967 트리의 지름 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 11725번 트리의 부모 찾기 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 1991 트리 순회 - JavaScript(NodeJS)  (1) 2021.06.03
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 2529번 부등호 - JavaScript(NodeJS)
    • [백준] 1967 트리의 지름 - JavaScript(NodeJS)
    • [백준] 11725번 트리의 부모 찾기 - JavaScript(NodeJS)
    • [백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바