BOJ 1009 분산처리
2023-05-25
1 min
자연수 N이 주어졌을 때, 2의 제곱수면 1을 아니면 0을 출력하는 프로그램을 작성하시오.
첫째 줄에 이 주어진다.
해당 문제는 자연수 N이 주어졌을 때 2의 제곱수인지 아닌지 판별하라는 문제이다.
최대 까지의 자연수가 입력 될 수 있으므로 이는 32Bit 정수형으로 표현 가능하다.
따라서 (0 ≤ K ≤ 30)을 연산하여 N과 같은지 비교하여 판별하면 된다.
이 때, 1을 좌측으로 K번 Shift하면 과 같다는 특징을 이용하면 곱셈 연산을 이용할 때 보다 빠른 처리가 가능하다.
1을 Shift연산한 결과는 아래의 표와 같다.
연산 | 비트 | 결과 |
---|---|---|
1 << 0 | 00000001 | 1 |
1 << 1 | 00000010 | 2 |
1 << 2 | 00000100 | 4 |
1 << 3 | 00001000 | 8 |
1 << 4 | 00010000 | 16 |
1 << 5 | 00100000 | 32 |
import java.io.*; class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); boolean flag = false; // 정수 입력 int N = Integer.parseInt(br.readLine()); for(int i = 0; i < 31; i++) { // Shift연산 결과와 정수 비교 if(N == (1 << i)) flag = true; } if(flag) System.out.println(1); else System.out.println(0); } }
#include <iostream> #define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr) #define endl '\n' using namespace std; int main() { fastio; bool flag = false; // 정수 입력 int N; cin >> N; for(int i = 0; i < 31; i++) { // Shift연산 결과와 정수 비교 if(N == (1 << i)) flag = true; } if(flag) cout << 1 << endl; else cout << 0 << endl; return 0; }
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) { var flag = false // 정수 입력 var N = readLine().toInt() for(i in 0 until 31) { // Shift연산 결과와 정수 비교 if(N == (1 shl i)) flag = true } if(flag) println(1) else println(0) }
from sys import stdin def main(): flag = False # 정수 입력 N = int(stdin.readline()) for i in range(0, 31): # Shift연산 결과와 정수 비교 if N == (1 << i): flag = True if flag: print(1) else: print(0) if __name__ == "__main__": main()
import Foundation func main() { var flag = false // 정수 입력 var N = Int(readLine()!)! for i in 0..<31 { // Shift연산 결과와 정수 비교 if N == (1 << i) { flag = true } } if flag { print(1) } else { print(0) } } main()