연결된 정점들

웹 개발/Algorithm 2021. 3. 11. 16:27
더보기

문제

방향이 있는 간선들의 목록이 주어질 때, 연결된 정점의 컴포넌트(그룹들)가 몇 개인지 반환하는 함수를 작성하세요.

입력

인자 1: edges

  • 2차원 Array 타입을 요소로 갖는 시작과 도착 정점이 담겨있는 배열들을 담고 있는 목록 (2차원 배열)
  • ex) [[0, 1], [1, 2], [3, 4]]

출력

  • Number 타입을 리턴해야 합니다.
  • 연결된 정점의 컴포넌트의 수를 숫자로 반환합니다.

주의사항

  • 주어진 간선은 무향입니다
    • [1, 2] 는 정점 1에서 정점 2로도 갈 수 있으며, 정점 2에서 정점 1로도 갈 수 있습니다.

입출력 예시

const result = connectedVertices([
	[0, 1],
	[2, 3],
	[4, 5],
]);
console.log(result); // 3

해당 정점들은 아래와 같은 모양을 하고 있습니다.

정점들
const result = connectedVertices([
	[0, 1],
	[2, 3],
	[3, 4],
	[3, 5],
]);
console.log(result); // 2

해당 정점들은 아래와 같은 모양을 하고 있습니다.

정점들
function connectedVertices(edges) {
  let result = []
  for(let edge of edges){
    //result: [[0,1],[2,3]]
    //edge : 3,4
    let li = edge
    let flag = false;
    //toDo
    for(let el of result){
      //el: [2,3]
      if(el.includes(edge[0]) || el.includes(edge[1])){
        flag = true
        if(el.includes(edge[0])){
          el.push(edge[1])
        }
        else{
          el.push(edge[0])
        }
      }
      
    }
    if(flag === false){
      result.push(li)
    }
  }

  let combine = function(arr){
    let result = []    
    for(let i =0; i<arr.length; i++){
      let nextArr = arr[i+1] || []
      let flag= false;
      
      for(let j=0;j<nextArr.length;j++){
        if(arr[i].includes(nextArr[j])){
          flag = true
        }
      }
        
      if(flag){//포함이 되있다.
        result.push(arr[i].concat(nextArr))//서로 포함관계인 두 요소를 합치고
        arr[i + 1] = arr[i+2] //합쳐졌으니 자리를 옮겨준다
        result = combine(result) //포함이 있는지 다시 확인. 있다면 다시 포함.없으면 그대로
      }else{
        result.push(arr[i])
        if(i === arr.length-1 && nextArr.length >= 1){
          result.push(nextArr)
        }
      }
    }
    return result
  }
  let result2 = combine(result)
  let tempArr = result2.slice()
  for(let el of tempArr){
    if(el === undefined){
      result2.pop()
    }
  }
  
  

  return result2.length
}

 

'웹 개발 > Algorithm' 카테고리의 다른 글

금고를 털어라  (0) 2021.03.11
짐 나르기  (0) 2021.03.11
바코드  (0) 2021.03.11
인접 행렬 길찾기  (0) 2021.03.11
인접 행렬 생성하기  (0) 2021.03.11
: