🔗 배고파(Easy)
https://www.acmicpc.net/problem/28239
📌 문제 요약
주어진 양의 정수 m에 대해 2^x + 2^y = $인 음이 아닌 정수 x와 y를 찾은 뒤 메뉴판의 (x,y) 위치에 적힌 메뉴를 고른다. 단, x <= y인 경우만 다룬다.
입력: 첫 번째 줄에 메뉴의 수 n이 주어진다 이어서 n개의 각 줄에 메뉴를 고를 때 사용할 양의 정수 m이 하나씩 주어진다.
출력: n개의 줄에 각각 주문할 메뉴의 위치 (x,y)의 x, y를 공백으로 구분하여 출력한다.
💡 접근 방법
문제에서 요구하는것이 2의 제곱쌍을 알아내는 것이기 때문에 이진수 비트 값을 활용해 문제를 풀어나가기로 했다.
m값의 제한이 int 범위를 넘어 long long으로 선언해주고, 비트값 또한 같은 자료형으로 선언하여
비트 자릿수마다 확인해 작은 자릿값부터 출력해준다.
⚠️ 처음에 했던 실수
자료형을 m값에만 적용하여 비트 값 계산하는 부분에서 자료형 에러가 났었다.
비트 계산하는 c 값에도 자료형을 적용한 뒤 에러가 안났다.
💻 코드
#include <iostream>
using namespace std;
long long n, m;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for(int i = 0; i < n; ++i)
{
cin >> m;
long long c=1;
for(int j = 0; j < 64; ++j)
{
if((c << j) == m)
{
cout << j - 1 << ' ' << j - 1;
}
else if((c << j) & m)
{
cout << j << ' ';
}
}
cout << '\n';
}
return 0;
}