반응형
https://school.programmers.co.kr/learn/courses/30/lessons/150367
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이진 트리로 구성 가능한지 판단하는 문제이다.
이진 트리를 구성 하는 룰에 따라 LeafNode ( 자식이 없는 마지막 노드 ) 가 있다면,
그 부모의 노드도 있어야 하기에 이진법으로 변환한 값을 보고 부모의 여부를 판단할 수 있다.
입력된 값을 이진법으로 변환한 뒤 인덱싱을 위해 암묵적 ( 문제의 점선 ) 노드를 모두 생성한 뒤
( white space )
왼쪽, 오른쪽의 노드가 있으면서 부모가 없는 경우를 실패하는 경우로 간주하여 문제를 풀 수 있다.
큰 고민 없이 N^2 시간 복잡도로 풀 수 있다.
function solution(numbers) {
function getAnswer(number) {
// decimal -> binary
var numStr = number.toString(2);
var numStrLength = numStr.length;
// get maximum length of binary digit
var maxLeafNumIdx = 1;
var maxLeafNum = (1 << maxLeafNumIdx) - 1;
while(maxLeafNum < numStrLength) {
maxLeafNumIdx += 1;
maxLeafNum = (1 << maxLeafNumIdx) - 1;
}
// fill white space ( 0 )
for (var i = numStrLength; i < maxLeafNum; i++) {
numStr = '0' + numStr;
}
// step below to top
for (var i = 1; i < maxLeafNumIdx; i++) {
for (var j = (1 << (i - 1)); j < maxLeafNum; j += (1 << (i + 1))) {
var leftIdx = j;
var rightIdx = j + (1 << i);
// left or right is '1'. there's parent must be '1'.
// * add '-1' when index to array
if ((numStr[leftIdx - 1] === '1' || numStr[rightIdx - 1] === '1') && numStr[((leftIdx + rightIdx) / 2) - 1] === '0') {
return 0;
}
}
}
return 1;
}
return numbers.map(getAnswer);
}
반응형
'ACM준비 > Programmers' 카테고리의 다른 글
미로 탈출 명령어 (0) | 2023.05.17 |
---|---|
표 병합 (0) | 2023.05.16 |
이모티콘 할인행사 (0) | 2023.05.12 |
택배 배달과 수거하기 (0) | 2023.05.11 |
개인정보 수집 유효기간 (0) | 2023.05.10 |