알고리즘/프로그래머스
[프로그래머스] 표현 가능한 이진트리
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;
}
}