class Solution {
public int solution(int[] cards) {
int answer = 0;
int cardsCount = cards.length;
boolean[] isOpen = new boolean[cardsCount];
int []cardsMaxArray=new int[cardsCount];
boolean check=false;
for (int i = 0; i < cardsCount; i++) {
isOpen[i] = false;
}
for (int i = 0; i < cardsCount; i++) {
int currentIndex = i;
int currentCount = 0;
while (!isOpen[currentIndex]) {
isOpen[currentIndex] = true;
currentIndex = cards[currentIndex] - 1;
currentCount++;
}
for(int k=0; k<cardsCount; k++){
if(!isOpen[k]){
check=true;
break;
}
}
if(!check){
return answer;
}
cardsMaxArray[i]=currentCount;
}
int first=0;
int second=0;
for(int i=0; i<cardsMaxArray.length; i++){
if(first<cardsMaxArray[i]){
first=cardsMaxArray[i];
}
}
for(int i=0; i<cardsMaxArray.length; i++){
if(cardsMaxArray[i]!=first&&second<cardsMaxArray[i]){
second=cardsMaxArray[i];
}
}
answer=first*second;
return answer;
}
}
우선 1번과 3번 테스트 케이스를 제외하곤 모두 통과했다. 문제는 복잡하지만 사실 간단하게 접근할 수 있는데 결국
통이 열렸는가?아닌가? 에 대한 boolean배열을 만들어주고 해당 통을 열면 boolean값을 true로 변경 그후 카운트를 올려주는 식으로 만든다면 몇개의 통을 열였는지에 대한 각각의 값들이 cardsMaxArray에 저장되고 이 저장된 배열에서의 최대값 2개를 곱해주는 형식으로 만들었으나 정답률이 100이 나오지 않은 관계로 추후 보완할 예정이다.