이 문제에서는 하나의 숫자 N이 주어지며, 주어진 정수 N의 처음 세 비트와 마지막 세 비트를 추출하여 이를 십진수로 변환하는 것이 우리의 과제입니다.
예시를 통해 문제를 이해해 보겠습니다.
입력 : 57 출력 : 7 1
문제 풀이 접근법
가장 간단한 해결 방법은 숫자 n을 이진수로 변환한 뒤, 각 비트를 배열에 저장하는 것입니다. 그다음 배열에서 처음 세 개 값과 마지막 세 개 값을 각각 따로 읽어 십진수로 변환하면 됩니다. 이렇게 얻은 두 십진수 값이 바로 우리가 원하는 결과입니다.
예를 들어 숫자 80을 살펴보겠습니다.
80을 이진수로 변환하면 1010000입니다.
처음 세 비트(101)의 십진수 값은 5입니다.
마지막 세 비트(000)의 십진수 값은 0입니다.
따라서 출력 결과는 5 0이 됩니다.
구현 예제
아래는 위에서 설명한 솔루션의 동작을 보여주는 C++ 프로그램입니다.
#include <bits/stdc++.h>
using namespace std;
void convtbnTodcml(int n)
{
int arr[64] = { 0 };
int x = 0, index;
for (index = 0; n > 0; index++) {
arr[index] = n % 2;
n /= 2;
}
x = (index < 3) ? 3 : index;
int d = 0, p = 0;
for (int index = x - 3; index < x; index++)
d += arr[index] * pow(2, p++);
cout << d << " ";
d = 0;
p = 0;
for (int index = 0; index < 3; index++)
d += arr[index] * pow(2, p++);
cout << d;
}
int main()
{
int n = 57;
cout<<"숫자 "<<n<<"의 처음과 마지막 비트의 십진수 변환값: ";
convtbnTodcml(n);
return 0;
}출력 결과
숫자 57의 처음과 마지막 비트의 십진수 변환값: 7 1
코드 설명
위 프로그램의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
1. 이진수 변환: 숫자 n을 2로 나눈 나머지를 배열에 차례대로 저장합니다. 이때 배열에는 최하위 비트(LSB)부터 순서대로 저장되므로, 배열의 앞부분이 곧 마지막 세 비트에 해당합니다.
2. 처음 세 비트 처리: 총 비트 개수(index)가 3보다 작으면 3으로 보정하여, 상위 세 비트에 해당하는 배열 구간의 값을 2의 거듭제곱과 곱해 합산함으로써 십진수로 변환합니다.
3. 마지막 세 비트 처리: 배열의 인덱스 0부터 2까지의 값을 같은 방식으로 합산하여 십진수로 변환한 뒤 출력합니다.
이 알고리즘의 시간 복잡도는 O(log N)이며, 공간 복잡도 역시 O(log N)입니다. 숫자를 이진수로 변환하는 데 필요한 비트 수에 비례하기 때문입니다.