알고리즘 문제/프로그래머스

표현 가능한 이진트리 [Lv.3]

우대비 2024. 6. 3. 14:54
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

수를 입력받고 이 수를 이진트리로 만들 수 있는지 확인하는 문제입니다.

조건은 노드의 값이 1일때만 자식 노드를 가질 수 있습니다.

 

 

풀이 방법

1. 입력받은 수를 이진수로 변환

2. 이진수를 이진트리로 변환하였을때 포화이진수가 되게끔 '0'을 추가

3. 중간값을 기준으로 좌 우로 string을 나누어 재귀

4. 3개의 값이 있을때 중간값이 0이면 false 아니면 true 반환

 

정답 코드

string itob(long long i)
{
    string r;
    while (i > 0)
    {
        r = to_string(i % 2) + r;
        i /= 2;
    }
  
    int n = 2;
    while (n < r.size() + 1)
        n = n * 2;

    while (n  > r.size() + 1)
        r = '0' + r;
    
    return r;
}

 입력받은 수를 이진수로 변환해주며 포화이진트리가 되게끔 0을 추가해주었습니다.

 

bool check(string str)
{
    if (str.size() == 1 || isAllZero(str)){
        return true;
    }
        
    int mid = str.size() / 2;
    string left = str.substr(0, mid);
    string right = str.substr(mid + 1);

    return str[mid] == '1' && check(left) && check(right);
}

str 사이즈가 1이거나 모두 0이면 true를 반환합니다.

반환 후 mid 값이 1이면 true 아니면 0을 반환합니다.

 

vector<int> solution(vector<long long> numbers) {
    vector<int> answer;
    
    for (int i = 0; i < numbers.size(); i++)
    {
    //    cout << itob(numbers[i]) << "\n";
        if (check(itob(numbers[i])))
            answer.push_back(1);
        else
            answer.push_back(0);
    }
    
    return answer;
}

 

반응형
LIST

'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글

1, 2, 3 떨어뜨리기 [Lv.4]  (0) 2024.06.07
표 병합 [Lv. 3]  (0) 2024.06.04
미로 탈출 명령어 [Lv.3]  (0) 2024.06.02
택배 배달과 수거하기 [Lv.2]  (0) 2024.06.01
이모티콘 할인행사 [Lv.2]  (0) 2024.05.30