37. graph 인접 행렬 찾기

홍인열·2021년 10월 12일
0

graph 인접 행렬 찾기

코플릿을 풀머 머리가 멈추는 느낌을 받았다. 도무지 이해가 되지않았다!
레퍼런서 코드를 참조하여 코드를 짜보고 디버그를 돌리며 조금씩 이해를했다
수도코드를 작성하면서 해당 코드가 어떤 역할을 하는지 생각하며 코드짜리를 몇번
혼자서 코드를 구성했지만 외운느낌이랄까?
하지만 알고리즘이 파악됬다. 왜이리도 오래걸리는건지..
결국 오늘은 코플릿 하나 이해하기에도 벅찼다..휴
더 재대로 해야겠다 만은 반성을 하는 날이다.

function getDirections(matrix, from, to) {
  // TODO: 여기에 코드를 작성합니다.
  // 순차적으로 탐색할수있도록 queue를 만들고, 그 첫번째 인자로 from을 넣는다.
  const queue = [from];
  const inqueue = (n) => queue.push(n);
  const dequeue = () => queue.shift();

  //해당 행을 탐색했는지 확인하기위한 배열을 만든다.
  const isCheckedRow = new Array(matrix.length).fill(false);

  // 첫 정점 확인여부를 표시, 방문하지 않았을 경우 queue 추가되어 확인진행을함
  // from은 queue에 들어있기 때문에 해당 행은 확인한것으로 취급
  isCheckedRow[from] = true;

  // 확인 로직 작성!
  // queue와 while은 친구!!
  // 확인할 행이 queue에 들어있기때문에 확인할 행이 빌때까지 확인반복
  while (queue.length > 0) {
    //queue의 0번째 인자를 꺼내고 확인용 행에 할당
    const currentRow = dequeue();
    //메트릭스의 행이 to과 같다면 간선이 연결된것
    if (currentRow === to) {
      return true;
    }
    // 현재행(정점)에 연결된(간선이있는) 정점들을 확인
    // 간선 유무 확인
    for (let i = 0; i < matrix[currentRow].length; i += 1) {
      // 간선이있고 연결된 행을 확인하지 않았다면 해당 행을 queue에 할당.
      if (matrix[currentRow][i] > 0 && !isCheckedRow[i]) {
        //if(간선이면1, 1이면 truthy && 확인안됬으면 true)
        // 확인 할 항목에 i를 추가 => 해당 행(matrix[i]행)을 확인목록에 추가
        inqueue(i);
        // 확인할 목록에 추가됫기때문에 해당행은 확인했음으로 처리
        isCheckedRow[i] = true;
      }
    }
  }
  return false;
}


console.log(
  getDirections(
    [
      [0, 1, 0, 1],
      [1, 0, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 0],
    ],
    1,
    3
  )
);
// > true
profile
함께 일하고싶은 개발자

0개의 댓글