Koala - 13기/기초 알고리즘 스터디

[백준/C++] 15917: 노솔브 방지문제야!!

alswns8081 2024. 1. 13. 19:26

 문제 설명

여러분은 Q개의 쿼리를 수행해야 합니다. 수행해야 하는 쿼리는 다음과 같습니다.

어떤 수 a를 2의 거듭제곱 꼴로 나타낼 수 있는가?

 

 입력

첫 줄에 Q가 주어집니다. (1 ≤ Q ≤ 106)

두 번째 줄부터 Q+1번째 줄까지 a가 주어집니다. a는 1이상 231-1이하 자연수입니다.

 

 출력

각 쿼리마다, 답이 Yes이면 1을, 그렇지 않으면 0을 출력합니다.

 

 

 소스 코드

#include <iostream>

using namespace std;

int main() {
    int t;

    cin >> t;

    int a[t], result[t];
    for ( int i = 0; i < t; i++ )
    {
        cin >> a[i];
        if ( a[i] == 1 ) result[i] = 1;
        while ( a[i] / 2 > 0 )
        {
            if ( (a[i] / 2) * 2 != a[i] )
            {
                result[i] = 0;
                break;
            }
            if ( (a[i] / 2) == 1)
            {
                result[i] = 1;
                break;
            }
            a[i] = a[i] / 2;
        }
    }

    for ( int i = 0; i < t; i++ ) cout << result[i] << "\n";
}

 

 문제 풀이

1. 테스트 케이스의 개수 t를 입력받는다.

2. t번 반복하며 k(숫자)를 입력 받는다.

3. result 배열은 선언해, 각 k의 경우를 비교한다.

- (1) k가 1인 경우는 result 배에 1 저장한다.

- (2) 아닌 경우, while문을 돌리면서 k를 2로 나눈다.

     #1. 나눈 몫 * 2가 기존 k의 값과 같지 않다면, 홀수 경우로 result 배열에 0을 저장한다.

     #2. 마지막 까지 갔을 때, 몫이 1로 나오면, 2의 거듭제곱꼴이므로, result 배열에 1을 저장한다.