프로그래머스 혼자 놀기의 달인 JavaScript
2023년 1월 15일
문제 풀이
매개변수 cards가 주어졌을 때, cards의 순서대로 카드를 뽑는다. 뽑은 카드의 값 cards[i] - 1 의 인덱스의 카드를 뽑을 수 없을 때까지 계속 뽑는다. 이렇게 해서 나온 카드들이 하나의 그룹이 된다. 카드 그룹들 중 제일 긴 두 개의 그룹을 곱해서 리턴하면 되는 문제
check
: 뽑은 카드인지 체크하기 위한 배열 0이 기본 값groupScore
: 그룹, 그룹의 길이을 저장하는 배열
조회하는 카드의 check[i]
가 0일 때 check[i]
를 새로운 그룹 groupIdx
로 갱신하고 현재 카드에서 시작하여 카드를 뽑을 수 없을 때까지 뽑는다. 뽑을 카드의 인덱스 afterIdx
는 cards[currentIdx]-1 이며, check[afterIdx]
가 0이 아니면 이미 뽑은 카드여서 멈춘다.
뽑은 카드를 그룹화, 그룹의 길이 +1, currentIdx
을 갱신한다. while 문이 끝나면 groupScore
에 [그룹 인덱스, 그룹의 길이]를 push 한다.
카드를 다 뽑았을 때 그룹이 하나일 시 0을 리턴하고 두 개 이상이면 그룹의 길이를 기준으로 내림차순으로 정렬해 groupScore
idx 0, 1의 그룹의 길이를 곱해 리턴
solution.js
function solution(cards) {
let answer = 0;
let groupIdx = 1;
const check = [...new Array(cards.length)].map(() => 0);
const groupScore = [];
for (let i = 0; i < cards.length; i++) {
if (check[i] === 0) {
check[i] = groupIdx;
let currentIdx = i;
let currentIdxLength = 1;
while (true) {
const afterIdx = cards[currentIdx] - 1;
if (check[afterIdx] !== 0) {
break;
}
check[afterIdx] = groupIdx;
currentIdx = afterIdx;
currentIdxLength++;
}
groupScore.push([groupIdx, currentIdxLength]);
groupIdx++;
}
}
groupScore.sort((a, b) => b[1]-a[1]);
answer = groupScore.length > 1 ? groupScore[0][1] * groupScore[1][1] : 0;
return answer;
}