[알고리즘/C#] 프로그래머스 - 혼자 놀기의 달인 (완전 탐색)

0시0분·2024년 8월 16일
0

알고리즘

목록 보기
17/23

✏️ 풀이 방법
일단 문제 이해 자체가 힘들었다. 이 글을 보고 겨우 이해했다.
일단 모든 그룹의 수를 다 곱하는것이 아니고, 그룹 개수가 높은순으로 딱 두가지만 곱해야 한다. (명확하게 두 그룹만 고려한다는 표기도 없고..)
또, 처음엔 나열한 리스트를 주는걸로 이해했는데 그게 아니라 임의로 또 섞어서 계산해야 했다.

그 부분만 이해하면 금방 해결할 수 있었다.
루프를 이루는 그룹을 찾아 방문여부를 체크하고, 개수를 저장해두면 된다.

using System;
using System.Collections.Generic;

public class Solution {
    int CheckGroup(int idx, int[] cards, ref HashSet<int> visited)
    {
        int groupCnt = 0;

        while (true)
        {
            visited.Add(idx);
            groupCnt++;

            if (visited.Contains(cards[idx - 1])) break;

            idx = cards[idx - 1];
        }

        return groupCnt;
    }

    public int solution(int[] cards)
    {
        int answer = 1;

        HashSet<int> visited = new HashSet<int>();
        List<int> calcAnswer = new List<int>();

        for (int i = 0; i < cards.Length; ++i)
        {
            if (visited.Contains(cards[i])) continue;

            calcAnswer.Add(CheckGroup(i + 1, cards, ref visited));
        }

        calcAnswer.Sort((n1, n2) => n2.CompareTo(n1));
        answer = calcAnswer.Count >= 2 ? calcAnswer[0] * calcAnswer[1] : 0;

        return answer;
    }
}

0개의 댓글