프로그래머스 혼자 놀기의 달인 JavaScript

2023년 1월 15일

프로그래머스 혼자 놀기의 달인

문제 풀이

매개변수 cards가 주어졌을 때, cards의 순서대로 카드를 뽑는다. 뽑은 카드의 값 cards[i] - 1 의 인덱스의 카드를 뽑을 수 없을 때까지 계속 뽑는다. 이렇게 해서 나온 카드들이 하나의 그룹이 된다. 카드 그룹들 중 제일 긴 두 개의 그룹을 곱해서 리턴하면 되는 문제

  • check: 뽑은 카드인지 체크하기 위한 배열 0이 기본 값
  • groupScore: 그룹, 그룹의 길이을 저장하는 배열

조회하는 카드의 check[i]가 0일 때 check[i]를 새로운 그룹 groupIdx로 갱신하고 현재 카드에서 시작하여 카드를 뽑을 수 없을 때까지 뽑는다. 뽑을 카드의 인덱스 afterIdxcards[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;
}

댓글