✏️ 풀이 방법
일단 문제 이해 자체가 힘들었다. 이 글을 보고 겨우 이해했다.
일단 모든 그룹의 수를 다 곱하는것이 아니고, 그룹 개수가 높은순으로 딱 두가지만 곱해야 한다. (명확하게 두 그룹만 고려한다는 표기도 없고..)
또, 처음엔 나열한 리스트를 주는걸로 이해했는데 그게 아니라 임의로 또 섞어서 계산해야 했다.
그 부분만 이해하면 금방 해결할 수 있었다.
루프를 이루는 그룹을 찾아 방문여부를 체크하고, 개수를 저장해두면 된다.
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;
}
}