본문 바로가기

카테고리 없음

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

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이 나오지 않은 관계로 추후 보완할 예정이다.