[백준 11966] 2의 제곱인가? (C#, C++) - soo:bak
작성일 :
문제 링크
설명
자연수 N
이 주어졌을 때, 이 수가 2의 거듭제곱 형태인지 여부를 판별하는 문제입니다.
즉, N = 2^k
꼴이 되는지 확인하여:
- 맞다면
1
을 - 아니라면
0
을 출력합니다.
접근법
- 입력으로 주어진
N
에 대해:
1 → 2 → 4 → 8 → ...
처럼 2의 거듭제곱 수열을 하나씩 곱해가며 확인합니다. - 처음부터
1
에서 시작하여 2씩 곱해나가고,
그 값이N
과 같아지는 순간이 있으면 2의 제곱입니다. - 반복 중 그 값을 초과하면 더 이상 확인할 필요 없이 2의 제곱이 아님을 판단합니다.
비트 연산을 사용하여 N & (N - 1) == 0
조건을 통해 판별할 수도 있으나,
반복문을 통한 직관적인 풀이도 가능합니다다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
class Program {
static void Main() {
int n = int.Parse(Console.ReadLine());
int pow = 1;
while (pow < n)
pow *= 2;
Console.WriteLine(pow == n ? 1 : 0);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
int b = 1;
while (b < n) b *= 2;
if (b == n) cout << 1 << "\n";
else cout << 0 << "\n";
return 0;
}