프로그래머스
프로그래머스 - 표현 가능한 이진 트리
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]);
}
}
}
코드가 살짝 조잡하다.. 더 열심히 해야지..