TIL

https://school.programmers.co.kr/learn/courses/30/lessons/150367 표현가능한 이진트리


import java.util.*;

class Solution {
    public int[] solution(long[] numbers) {
        //numbers.length <= 10^4
        //numbers[0]<=10^15, 2^15 * 5^15 < 2^15 * 2^15* 2^15 * 2^15
        // 1 - 1 - 1
        // 2 - 010 - 1
        // 3 - 011 - 1
        // 4 - 100 - 0
        // 5 - 101 - 0
        // 6 - 110 - 1
        // 7 - 111 - 1
        // 8 -  0001000 - 1 FJ=3 
        // 42 - 0101010  // 64, 32^, 16, 8^, 4, 2^, 1
        // 45 - 0101101 - 
        // 63 - 0111111
        // 95 - 1011111 ㅂㄱㄴ
        // 127 - 1111111 / FJ=6
        // 128 - 000000010000000 / FJ=7
        // 255 - 000000011111111 / FJ=7
        
        
        int len=numbers.length;
        int[] answer = new int[len];
        
        
        for(int i=0;i<len;i++) {
            answer[i]=doSome(numbers[i]);
        }
        
        
        return answer;
    }
    
    public int doSome(long n) {
        StringBuilder sb=new StringBuilder();
        
        long curr=n;
        boolean firstFlag=false;
        int jisu=60;
        int firstJisu=-1;
        
        while(jisu!=-1) {

                
            if(curr/(long)Math.pow(2,jisu)==1) {
                sb.append("1");
                if(!firstFlag) {
                    firstJisu=jisu;
                }
                firstFlag=true;

                
             //   System.out.println("firstJisu "+firstJisu);
                
                curr-=Math.pow(2,jisu);
            } else if(firstFlag && curr/(long)Math.pow(2,jisu)==0) {
                sb.append("0");
            }
            
            jisu--;
        } //while
       
        int t=0;
        while(true) {
            if(Math.pow(2,t)-1<=firstJisu && firstJisu<=Math.pow(2,t+1)-2) {
                break;
            }
            t++;
        }
        //System.out.println("t "+t);
       // System.out.println("before sb.length " +sb.length());
        
        while(sb.length()<=(long)Math.pow(2,(t+1))-2) {
            sb.insert(0,"0");
        }
        
        
        
        
       // System.out.println(sb.toString());
        Character c=sb.toString().charAt(sb.toString().length()/2);
        return isSymm(sb.toString(),c);
        
        
    }
    
    public int isSymm(String str,Character origC) {
        
        
        if(str.length()==1) { //리프
            return 1;
        }
        
        if(origC=='1') {
            StringBuilder sb=new StringBuilder(str);
            int leftMid=(0+str.length()/2)/2;
            int rightMid=((str.length()/2+1)+(str.length()))/2;
            int left=isSymm(sb.substring(0,str.length()/2),sb.toString().charAt(leftMid));
            int right=isSymm(sb.substring(str.length()/2+1,str.length()),sb.toString().charAt(rightMid));
            if(left==1 && right==1) {
                return 1;
            } else {
                return 0;
            }
        } else { //부모가 0
            boolean flag=true;
            
            for(int i=0;i<str.length();i++) {
              
                if(str.charAt(i)=='1') {
                    flag=false;
                }
                
            }
            if(flag) {
                return 1;
            } else {
                return 0;
            }
        } //부모가 0
        

        
        
    } //isSymm
}

results matching ""

    No results matching ""