숫자로 이루어진 문자열이 주어졌을 때, 해당 숫자가 특정 진법 B에 유효한 값인지 확인해야 하는 경우가 있습니다.
예를 들어, 문자열이 "101110"이고 진법이 2라면 프로그램은 true를 반환합니다. 마찬가지로 문자열이 "A8F"이고 진법이 16이라면 역시 true를 반환하게 됩니다.
문제 해결 접근 방식
해결 방법은 매우 간단합니다. 문자열의 모든 문자가 주어진 진법에서 사용되는 기호의 범위 안에 있다면 true를 반환하고, 하나라도 범위를 벗어나는 문자가 있다면 false를 반환하면 됩니다.
검증 규칙
이 프로그램은 최대 16진법까지 처리할 수 있으며, 다음과 같은 규칙으로 동작합니다.
- 진법이 16보다 크면 처리할 수 없으므로 false를 반환합니다.
- 진법이 10 이하인 경우, 문자열의 각 문자가 '0'부터 ('0' + 진법) 사이에 있는지 검사합니다.
- 진법이 11 이상인 경우, 숫자 문자 외에 'A'부터 ('A' + 진법 - 10) 사이의 알파벳 문자도 허용됩니다.
C++ 구현 예제
#include <iostream>
using namespace std;
bool inGivenBase(string s, int base) {
if (base > 16) // 프로그램은 최대 16진법까지만 처리 가능
return false;
else if (base <= 10) { // 0부터 9까지의 숫자 검사
for (int i = 0; i < s.length(); i++)
if (!(s[i] >= '0' && s[i] < ('0' + base)))
return false;
} else { // 11진법 이상: 숫자 + 알파벳 문자 검사
for (int i = 0; i < s.length(); i++)
if (!((s[i] >= '0' && s[i] < ('0' + base)) || (s[i] >= 'A' && s[i] < ('A' + base - 10))))
return false;
}
return true;
}
int main() {
string str = "A87F";
int base = 16;
if(inGivenBase(str, base)){
cout << str << " is in base " << base;
} else {
cout << str << " is not in base " << base;
}
}
실행 결과
A87F is in base 16
코드 설명
위 예제에서는 문자열 "A87F"가 16진법에 유효한지 검사합니다. 16진법에서 사용할 수 있는 문자는 0~9와 A~F이며, "A87F"의 모든 문자(A, 8, 7, F)가 이 범위에 포함되므로 프로그램은 해당 문자열이 16진법에 속한다는 결과를 출력합니다.
이러한 진법 검증 로직은 입력 데이터의 유효성을 검사하거나, 서로 다른 진법 간 변환 작업을 수행하기 전에 전처리 단계로 활용할 수 있습니다.