코딩/백준 문제 (브론즈)

[백준/15917/C언어] 노솔브 방지문제야!! _ 풀이

룻밤 2023. 8. 18. 16:27

https://www.acmicpc.net/problem/15917

 

15917번: 노솔브 방지문제야!!

어떤 수 a가 2의 거듭제곱꼴로 나타내어진다고 해 봅시다. 그렇다면, a = 2n (단 n ≥ 0인 정수) 를 만족할 겁니다. 보통, 각 비트별로 검사를 하면서, 켜져 있는 비트의 개수를 알아내는 것도 좋은

www.acmicpc.net


풀이

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
	int q;
	int a;
	scanf("%d", &q);
	int* pa = (int*)malloc(sizeof(int) * q);	// 동적 할당으로 q개만큼 a에 대한 값 저장

	for (int i = 0; i < q; i++) {		//q개만큼 반복
		scanf("%d", &a);			
		int j = 0;
		while (pow(2,j) <= a){			// 2의 j제곱이 a값 이하일때만 반복
			if (a == pow(2, j)) {		// 2의 j제곱이 a값이랑 같을때
				pa[i] = 1;				// pa[i]에 1값 저장
				break;
			}
			else 
				pa[i] = 0;				// pa[i]에 0값 저장
			j++;
		}
	}
	for (int i = 0; i < q; i++) printf("%d\n", pa[i]);		// pa를 모두 출력
	free(pa);		// 동적 할당 제거
	return 0;
}

1, 0 값을 한꺼번에 출력을 위해 배열을 사용해도 되지만
연습 목적으로 동적할당을 써봤다.

 

필자는 힌트의 2진법 풀이로 풀지않고 직접 거듭제곱을 탐색해서 풀어봤다.

pow()  = 거듭제곱 함수