프로그래머스

프로그래머스 - 표현 가능한 이진 트리

E재HO 2023. 8. 21. 13:56

이제 문제를 어떻게 풀지 다시 보자

import java.util.*;

class Solution {
    static boolean possible=true;
    public int[] solution(long[] numbers) {
        int[] answer = {};
        answer = new int[numbers.length];
        for(int i =0; i<numbers.length; i++){
            
            String binaryNumber = Long.toBinaryString(numbers[i]);
            int n = binaryNumber.length();
            
            int cnt=0;
            while(n>=Math.pow(2,cnt++));
            //만들어야할 포화트리노드 수
            int treeNodeSize = (int)Math.pow(2,cnt-1)-1;
            //루트 위치
            int rootIdx = (int)treeNodeSize/2;
            boolean [] arr = new boolean[treeNodeSize];
            
            int start = treeNodeSize-n;
            for(int idx=0; idx<n; idx++){
                if(binaryNumber.charAt(idx)=='1')arr[start]=true;
                start++;
            }
            possible=true;
            
            dfs(rootIdx,arr,0,treeNodeSize,cnt-2, false);
            
            if(!possible)
                answer[i]=0;
            else
                answer[i]=1;
            
        }
        
        return answer;
    }
    
    private static void dfs(int rootIdx, boolean [] arr,int depth, int treeNodeSize, int top, boolean flag){
        if(rootIdx>=treeNodeSize )return;
        if(flag && arr[rootIdx]){
            possible=false;
        }
        int next = (int)Math.pow(2,top-depth-1);
        if(next>0){
            dfs(rootIdx-next,arr,depth+1,treeNodeSize,top,!arr[rootIdx]);
            dfs(rootIdx+next,arr,depth+1,treeNodeSize,top,!arr[rootIdx]);
        }
        
    }
}

코드가 살짝 조잡하다.. 더 열심히 해야지..