프로그래밍/Algorithm

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

일단개그하다 2022. 11. 8. 23:29

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131130?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근 방법 및 풀이

배열의 값은 다음 수의 인덱스를 가리키고 있음

가리킨 인덱스를 추적하여 시작한 인덱스로 되돌아오면 하나의 묶음

각각의 묶음의 길이 중 가장 긴 길이와 두 번째 긴 길이의 곱을 반환

묶음의 길이를 구하기 위하여 재귀를 사용

 

public class Q30_131130 {
    public int solution(int[] cards) {
        int length = cards.length;

        int[] max = {-1, -1};

        for (int i = 0; i < length; i++) {
            if (cards[i] == -1) {
                continue;
            }

            int circleSize = circuit(cards, i);

            if (max[0] < circleSize) {
                max[1] = max[0];
                max[0] = circleSize;
            } else if (max[1] < circleSize) {
                max[1] = circleSize;
            }

        }

        if (max[0] == length) {
            return 0;
        } else {
            return max[0] * max[1];
        }
    }

    private int circuit(int[] cards, int index) {
        if (cards[index] == -1) {
            return 0;
        }

        int nextIndex = cards[index] - 1;
        cards[index] = -1;

        return circuit(cards, nextIndex) + 1;
    }
}