FrontEnd/프로그래머스

[JS] 섬 연결하기

728x90

union-find + 그리디 알고리즘을 활용해서 해결하였다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/42861

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

해당 문제는 그리디 알고리즘으로 해결할 수 있다. 우선 다리의 건설 비용을 오름차순으로 정렬을 해준다.

 

이후 정렬된 배열을 순회하며 두 다리가 연결이 안되어 있다면 연결해준다.

 

이 두 다리가 연결이 안되어 있는지를 확인하기 위해서 union-find 알고리즘을 활용하였다.

 

1. costs 배열을 비용을 기준으로 오름차순 정렬

2. costs배열을 순회하며 다리가 연결되어 있지 않다면 연결

3. 다리를 연결하고 만약 모든 다리가 연결되었다면 지금까지 건설 비용을 반환

 

 

 

 

//union-find
const getParent = (a, arr) => {
  if (arr[a] === a) return a;
  return (arr[a] = getParent(arr[a], arr));
};

const union = (a, b, arr) => {
  a = getParent(a, arr);
  b = getParent(b, arr);

  if (a > b) arr[a] = b;
  else arr[b] = a;
};

const isUnion = (a, b, arr) => {
  a = getParent(a, arr);
  b = getParent(b, arr);
  return a === b ? true : false;
};

//모든 섬이 연결되었는지 확인
const checkIsConnect = (arr) => {
  return arr.every((v) => v === 0);
};

function solution(n, costs) {
  //가격낮은순으로 정렬
  costs.sort((a, b) => a[2] - b[2]);
  let parents = [...Array(n)].map((_, i) => i);

  let ret = 0;
  for (const [s, e, c] of costs) {
    // 연결이 안되어있다면 연결해줌
    if (!isUnion(s, e, parents)) {
      union(s, e, parents);
      ret += c;
      //연결한 후에 모든 섬이 연결되었는지 확인
      parents = parents.map((v) => getParent(v, parents));
      if (checkIsConnect(parents)) return ret;
    }
  }
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 길 찾기 게임  (1) 2024.01.31
[JS] 디스크 컨트롤러  (0) 2024.01.30
[JS] 매칭 점수  (1) 2024.01.25
[JS] N으로 표현  (2) 2024.01.23
[JS] 산 모양 타일링 (카카오 겨울 인턴십)  (0) 2024.01.19