주어진 숫자 카드 더미에서 가장 긴 두 cycle들의 길이를 곱해서 반환하는 문제입니다. cards
를 읽으며 방문한 곳은 값을 0으로 변경합니다. 계속 방문하며 값이 0인 곳에 도달하면 한 cycle이 끝난 것입니다. 이런 식으로 cards
를 모두 방문하며 제일 긴 cycle의 길이 first
와 두번째로 긴 cycle의 길이 second
를 갱신하면 됩니다.
class Solution {
public int solution(int[] cards) {
int first = 0;
int second = 0;
int next = 0;
while (next < cards.length) {
int cur = 0;
while (cards[next] > 0) {
int temp = cards[next];
cards[next] = 0;
next = temp - 1;
cur++;
}
next++;
if (cur == cards.length) {
return 0;
}
if (cur >= first) {
second = first;
first = cur;
} else if (cur > second) {
second = cur;
}
}
return first * second;
}
}