728x90
dfs구조를 통해서 방문 배열을 하나 만든 이후에 이를 테스트 하는 방법으로 만드는 방법과 union-find 를 활용해서 구조를 만드는 것 중에서 고민하다가, 결국 루프를 만드는것이 문제의 의도라고 생각해서 union-find 알고리즘을 활용해서 구현해보았다.
개인적으로 해당 문제가 되게 재밌었다. 예전에 아래 유튜브 영상을 보았던 적이 있는데, 이번 문제에서 나온 것과 비슷한 원리가 담겨져 있다. 영상이 재미있으니 한번씩 보아도 좋을 것 같다.
https://www.youtube.com/watch?v=PE4vLbyOgw0
const find = (arr,a) => {
if (arr[a] === a) return a
return (arr[a] = find(arr, arr[a]));
}
const union = (arr,a,b) => {
a = find(arr,a)
b = find(arr,b)
if (a<b) arr[b] = arr[a]
else arr[a] = arr[b]
}
function solution(cards) {
const ary = [ ... new Array(cards.length+1)].map((_,i) => i)
cards = [0,...cards]
for (let i = 1 ; i < cards.length ; i++) {
union(ary,i,cards[i])
}
const map = new Map()
for (let i = 1 ; i < ary.length ; i++) {
const el = find(ary,ary[i])
if (map.has(el)) map.set(el,map.get(el)+1)
else map.set(el,1)
}
const ret = [...map].map(el => el[1]).sort((a,b) =>b-a)
return ret.length>1 ? ret[0] * ret[1] : 0
}
728x90
'FrontEnd > 프로그래머스' 카테고리의 다른 글
[JS] 양궁대회 (0) | 2023.06.08 |
---|---|
[JS] 두 큐 합 같게 만들기 (0) | 2023.06.08 |
연속 부분 수열 합의 개수 (0) | 2023.06.06 |
[JS] 택배상자 (0) | 2023.06.06 |
[JS] 롤케이크 자르기 (0) | 2023.06.05 |