작성일 :

문제 링크

11966번 - 2의 제곱인가?

설명

자연수 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;
}