[JS] Q15 특정 거리의 도시 찾기

Hadam Cho·2021년 4월 8일
1

Algorithm

목록 보기
15/32
post-custom-banner

제한 사항

난이도풀이 시간시간 제한메모리 제한
1.530분2초256MB

문제

어떤 나라에는 1~N번까지의 도시와 M개의 단방향 도로가 존재합니다. 모든 도로의 거리는 1입니다. 이때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서 최단 거리가 정확히 K인 모든 도시의 번호를 출력하는 프로그램을 작성하세요. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정합니다.

예를 들어 N = 4, K = 2, X = 1일 때 다음과 같이 그래프가 구성되어 있다고 합시다.

이때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시뿐입니다. 2번과 3번 도서의 경우, 최단 거리가 1이기 때문에 출력하지 않습니다.


입력 조건

  • 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어집니다.
    (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N)
  • 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 주어지며, 각 자연수는 공백으로 구분합니다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미입니다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수입니다.

출력 조건

  • X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력합니다.
  • 이때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력합니다.

입력 예시

4 4 2 1
1 2
1 3
2 3
2 4

출력 예시

4


소스 코드

function solution(N, M, K, X, city) {
  const graph = new Array(N).fill([]);
  city.split('\n').forEach(c => {
    const path = c.split(' ');
    const i = Number(path[0]) - 1;
    const j = Number(path[1]) - 1;
    graph[i] = [...graph[i], j];
  });

  const queue = [];
  queue.push(X-1);

  const distance = new Array(N).fill(-1);
  distance[X-1] = 0;

  while (queue.length !== 0) {
    const i = queue.shift();
    
    for (let j of graph[i]) {
      if (distance[j] === -1) {
        distance[j] = distance[i] + 1;
        queue.push(j);
      }
    }
  }

  const answer = [];
  for (let i = 0; i < distance.length; i++) {
    if (distance[i] === K) {
      answer.push(i + 1);
    }
  }

  if (answer.length === 0) {
    return -1;
  }

  answer.sort((a, b) => a - b);
  for (let a of answer) {
    console.log(a);
  }
}

solution(4, 4, 2, 1, '1 2\n1 3\n2 3\n2 4');

느낀 점

다익스트라 최단거리를 먼저 생각할법한 문제인데, 모든 거리가 1로 고정이기 때문에 좀 더 효율적으로 풀리는 BFS를 사용할 수도 있다는 것을 알게 되었다.

물론 어려워서 정답을 보고 풀었다...


백준 문제 링크

https://www.acmicpc.net/problem/18352

profile
(。・∀・)ノ゙
post-custom-banner

0개의 댓글