본문 바로가기
알고리즘/프로그래머스

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

by hwan-da 2024. 11. 11.
import java.util.*;

class Solution {
    public int[] solution(long[] numbers) {
        List<Integer> answers = new ArrayList<>();
        for (long num : numbers) {
            String str = Long.toBinaryString(num);

            int len = str.length();

            int result = cal(makeTreeStr(len, str));
            if (result == -1) {
                answers.add(0);
            } else {
                answers.add(1);
            }
        }

        int[] answer = new int[answers.size()];
        for (int i = 0; i < answers.size(); i++) {
            answer[i] = answers.get(i);
        }
        return answer;
    }

    private static String makeTreeStr(int len, String str) {
        StringBuilder sb = new StringBuilder(str);

        int std = 1;
        double num = Math.pow(2, std) - 1;
        while (num < len) {
            num = Math.pow(2, std) - 1;
            std++;
        }

        for (int i = 0; i < num - len; i++) {
            sb.insert(0, "0");
        }
        
        return sb.toString();
    }

    private int cal(String str) {
        StringBuilder sb = new StringBuilder(str);

        if (str.length() == 1) {
            return str.charAt(0) - '0';
        }

        int left = cal(sb.substring(0, sb.length() / 2));
        if (left == -1) return -1;

        int right = cal(sb.substring(sb.length() / 2 + 1));
        if (right == -1) return -1;

        int mid = str.charAt(sb.length() / 2) - '0';

        if ((left == 1 || right == 1) && mid == 0) return -1;

        if (left == 0 && right == 0 && mid == 0) return 0;

        return 1;
    }
}