Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- spring security
- 일급 컬렉션
- nestjs
- 일급 객체
- builder
- Spring
- java
- synchronized
- middleware
- OAuth 2.0
- Volatile
- Google OAuth
- lombok
- Dependency Injection
- factory
Archives
- Today
- Total
HJW's IT Blog
[Programmers] 표현 가능한 이진트리 [C++] 본문
https://school.programmers.co.kr/learn/courses/30/lessons/150367
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
숫자 numbers 가 주어질 때, 이 숫자를 이진수로 변환한 후, 이 이진수를 특정한 규칙에 따라 포화 이진트리로 변환해야 한다.
이진트리로 표현이 가능하다면 1, 없다면 0을 반환해야 한다
그렇다면 문제를 푸는 순서는 다음과 같다
- 이진수로 변환
- 포화 이진트리로 변환
- 표현 가능한지 확인
이진트리로 표현할 수 있는 숫자에 규칙이 있을까?
입출력 예시인 7, 42, 5 를 한번 살펴보자
7 → 111 (변환 가능)
42 → 101010 (변환 가능)
5 → 101 (변환 불가능)
위 예시를 포화 이진트리로 바꾸면 두가지 규칙을 찾을 수 있다
- 이진수의 중앙에 위치한 노드는 항상 루트 노드이다 + 0 이 될 수 없다
- 포화 이진트리에서 부모 노드가 0 인경우 자식 노드가 0일 수 없다
위 규칙을 가지고 포화 이진트리가 주어졌다고 가정할 때, 우리는 재귀적으로 해당 이진트리가 표현 가능한지 불가능한지를 알 수 있다. (왼쪽, 중앙, 오른쪽 으로 나누어 검사 및 탐색)
#include <string>
#include <vector>
using namespace std;
string toDec(long long num){
string ret = "";
while(num){
ret = to_string(num % 2) + ret;
num /= 2;
}
return ret;
}
string fullDec(string s){
string ret = s;
int idx= 2;
while(true){
if(s.length() < idx) break;
idx *= 2;
}
for(int i = 0; i< idx - 1 - s.length(); i++){
ret = "0" + ret;
}
return ret;
}
bool possible(string s){
if(s == "1") return true;
bool allZero = true;
for(int i = 0; i<s.length(); i++){
if(s[i] == '1') allZero = false;
}
if(allZero) return true;
int mid = s.length()/2;
string left = s.substr(0, mid);
string right = s.substr(mid + 1);
if(s[mid] == '1' && possible(left) && possible(right)) return true;
return false;
}
vector<int> solution(vector<long long> numbers) {
vector<int> answer;
for(const auto& num : numbers){
string dec = toDec(num);
string fDec = fullDec(dec);
answer.push_back(possible(fDec));
}
return answer;
}
'Algorithm' 카테고리의 다른 글
[프로그래머스] 2차원 동전 뒤집기 [C++] (1) | 2024.09.05 |
---|---|
[프로그래머스] 부대 복귀 [C++] (2) | 2024.09.05 |
[Programmers] 인사고과 [C++] (2) | 2024.09.02 |
[Programmers] 택배 배달과 수거하기 (0) | 2024.09.02 |
[Programmers] 이모티콘 할인 행사 [C++] (3) | 2024.09.02 |