문제
정수 N, M 이 주어질 때, M의 이진수 표현의 마지막 N 비트가 모두 1로 켜져 있는지 아닌지를 판별하여 출력하라.
[입력]
첫 번째 줄에 테스트 케이스의 수 TC가 주어진다.
이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다.
각 테스트 케이스는 다음과 같이 구성되었다.
첫 번째 줄에 정수 N, M이 주어진다. (1 ≤ N ≤ 30 , 0 ≤ M ≤ 108)
[출력]
각 테스트 케이스마다 한 줄씩
마지막 N개의 비트가 모두 켜져 있다면 ON
아니면 OFF 를 출력하라.
#include <iostream>
using namespace std;
int main()
{
int test_case;
int n, m;
cin >> test_case;
for (int i = 0; i < test_case; i++)
{
int a = 0;
cin >> n >> m;
for (int q = 0; q < n; q++)
{
a |= (1 << q);
}
if ((a & m) ==(1<<n)-1)
{
cout << "#" << i + 1 << " " << "ON" << endl;
}
else
{
cout << "#" << i + 1 << " " << "OFF" << endl;
}
}
return 0;
}
비트연산을 이용하면 쉽게 구현할 수 있다.
a에 0의 값을 저장하고 N개의 비트 수 만큼 시프트 시켜 최하위 비트부터 N개의 비트를 1로 바꿔준다.
ex) N = 4 일때, 1111
그리고 입력받은 정수 M과 AND 연산을 통한 값이 입력받은 N만큼 시프트한 값에 -1을 한 값이 같다면 문제에서 요구하는 조건과 동일하므로 ON을 출력하고 그렇지 않으면 OFF를 출력하게 한다.
이 부분이 이해가 쉽게 되지 않을 수 있어 다시 풀어서 설명해보자면
N개의 비트수만큼 1로 켜지게 되어 있을 때 ON을 출력하게 하도록 하는 문제이다.
ex) N = 4 일때, 0, 1, 2, 3 번의 비트가 모두 1
그렇다면 (a & M)을 하였을 때 결과 값이 모두 1인 경우
비트는 0번부터 존재하므로 N번만큼 왼쪽으로 시프트 시켰을 때의 값에서 -1을 해주면
그 0번부터 N-1번 까지의 비트들이 모두 1로 켜지게 되는 상황이므로
(a & M) == ((1<<n) - 1) 인 경우는 문제에서 ON의 조건에 해당하게 된다.
앞으로 22년 하계 대학생 S/W 알고리즘 역량강화 과정에 참가하게 되었다.
사전테스트 2문제 중 1개만 맞췄지만 운 좋게 통과했다..ㅎㅎ
백준뿐만 아니라 SWEA의 문제들도 종종 올리도록 하겠답 물론 공개되어 있는 것들만!!
화이팅하자~~!!