본문 바로가기
Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 조건에맞게수열변환하기2

by 외계나무 2024. 4. 11.

프로그래머스 - level 0 조건에 맞게 수열 변환하기 2

일단은 작업 흐름대로 작성해 보았는데... 일단 테스트 케이스는 통과했다. 그런데...

class Solution {
    public int solution(int[] arr) {
        int answer = 0;
        int[] brr = new int[arr.length];
        while(true) {
            answer++;
            
            for(int i=0; i<arr.length; i++) {
                if(arr[i]>=50 && arr[i]%2==0) arr[i]/=2;
                else if(arr[i]<50 && arr[i]%2!=0) arr[i] = arr[i]*2+1;
            }
            
            for(int i=0; i<arr.length; i++) {
                if(arr[i] != brr[i]) break;
                else if(i == arr.length-1) return answer-1;
            }
            System.arraycopy(arr, 0, brr, 0, arr.length);
            
            if(answer >= 1000) break;
        }
        return answer;
    }
}

케이스 12,13에서 실패가 떴다. 질문하기에 누가 써 둔 조언이 있어서 테스트 케이스에 [63] 넣고 해봤더니 1이 뜬다. 왜..?

 

고쳐보았다.

가장 처음, 그러니까 첫번째 반복일 때 이전 값과 같아서 출력이 0이 나오려면 반복 전에도 brr이 arr과 같은 값을 가지고 있어야 비교가 된다는 걸 놓쳤다. ㅎㅎ.. 한참 헤맸네...

class Solution {
    public int solution(int[] arr) {
        int answer = 0;
        int[] brr = new int[arr.length];
        System.arraycopy(arr, 0, brr, 0, arr.length);
        
        while(true) {
                
            for(int i=0; i<arr.length; i++) {
                if(arr[i]>=50 && arr[i]%2==0) arr[i]/=2;
                else if(arr[i]<50 && arr[i]%2!=0) arr[i] = arr[i]*2+1;
            }
            answer++;
            
            for(int i=0; i<arr.length; i++) {
                if(arr[i] != brr[i]) break;
                else if(i == arr.length-1) return answer-1;
            }
            
            System.arraycopy(arr, 0, brr, 0, arr.length);
                        
            if(answer > 10) break;
        }
        return answer;
    }
}

참고로 answer > 10 탈출 조건은, 반복이 최대 5번으로 보이는데 혹시 놓친 가능성이 있을까봐 넉넉히 10으로 잡음.

1. 50보다 작은 홀수로 시작 => *2 +1 이므로 결과는 홀수, 아무리 해도 "50 이상의 짝수"가 될 수 없음. 최대 1로 시작해서 1 -> 3 -> 7 -> 15 -> 31 -> 63, 총 5번.

2. 50 이상의 짝수로 시작 => /2 이므로 최댓값인 100으로 해도 100 -> 50 -> 25 -> 51이고, 100보다 작은 짝수라면 /2 하면 50보다 작아지고 그 상태에서 *2 +1 하면 50보다 큰 홀수가 될 것이므로 최대 2 번.