주어진 문자열이 올바른 ISBN 번호인지 아닌지 판별하는 것이 이번 글의 목표입니다. C++ 코드 예제와 함께 ISBN의 개념부터 검증 알고리즘까지 차근차근 살펴보겠습니다.
ISBN 번호란 무엇인가?
ISBN은 International Standard Book Number, 즉 국제 표준 도서번호의 약자입니다. 2006년 12월까지는 10자리 번호 체계가 사용되었으며, 2007년 1월 1일부터는 13자리 번호로 개정되었습니다. 이 글에서는 기존 방식인 10자리 ISBN의 구현 방법을 다룹니다.
ISBN의 각 자리에는 다음과 같은 규칙이 있습니다.
- 앞의 9자리는 해당 책의 제목, 출판사, 그룹(국가/언어권) 정보를 나타내며, 각 자리의 값은 0~9 사이입니다.
- 마지막 1자리는 ISBN이 올바른지 검증하는 용도로 사용됩니다. 마지막 자리의 값이 10일 경우에는 숫자 대신 기호 'X'로 표기합니다.
10자리 ISBN 검증 방법
주어진 10자리 숫자가 유효한 ISBN인지 확인하는 절차는 다음과 같습니다.
- 문자열의 첫 번째 자리부터 시작하여 10을 곱합니다(ISBN이 10자리이므로 첫 가중치는 10).
- 다음 자리로 이동할 때마다 곱하는 값(가중치)을 1씩 줄여갑니다. 즉, 두 번째 자리는 9, 세 번째 자리는 8과 곱합니다.
- 모든 곱셈 결과를 더합니다.
- 합계를 11로 나눕니다.
- 나눗셈 결과에 따라 조건을 판단합니다.
- 나머지가 0이라면(11로 나누어떨어진다면) 해당 번호는 유효한 ISBN입니다.
- 나머지가 0이 아니라면 해당 번호는 유효하지 않은 ISBN입니다.
예시
입력: 002442142X
출력: Not ISBN
입력: 007462542X
출력: It's ISBN
알고리즘
Start
Step 1-> ISBN 유효성 검사 함수 선언
bool isvalid(string &isbn_number)
int n = isbn_number.length() 설정
IF (n != 10)
return false
End
int sum = 0 설정
Loop For int i = 0 and i < 9 and i++
int value = isbn_number[i] - '0' 설정
If (0 > value || 9 < value)
return false
End
sum += (value * (10 - i))
End
char last_val = isbn_number[9] 설정
IF (last_val != 'X' && (last_val < '0' || last_val > '9'))
return false
End
sum += ((last_val == 'X') ? 10 : (last_val - '0'))
return (sum % 11 == 0)
Step 2-> main() 함수에서
string isbn_number = "002442142X" 설정
IF (isvalid(isbn_number))
"is Valid" 출력
Else
"is invalid" 출력
End
Stop
C++ 구현 예제
#include <bits/stdc++.h>
using namespace std;
// 유효한 ISBN인지 검사하는 함수
bool isvalid(string &isbn_number) {
int n = isbn_number.length();
if (n != 10)
return false;
int sum = 0;
for (int i = 0; i < 9; i++) {
int value = isbn_number[i] - '0';
if (0 > value || 9 < value)
return false;
sum += (value * (10 - i));
}
char last_val = isbn_number[9];
if (last_val != 'X' && (last_val < '0' || last_val > '9'))
return false;
sum += ((last_val == 'X') ? 10 : (last_val - '0'));
return (sum % 11 == 0);
}
int main() {
string isbn_number = "002442142X";
if (isvalid(isbn_number))
cout<<isbn_number<<" is Valid";
else
cout<<isbn_number<<" is invalid";
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
002442142X is invalid
코드의 동작 원리를 요약하면, 먼저 입력된 문자열의 길이가 10자리인지 확인합니다. 그다음 앞의 9자리가 모두 숫자인지 검사하면서 각 자리에 10부터 2까지의 가중치를 곱해 합산합니다. 마지막 자리는 숫자 또는 'X'만 허용되며, 'X'라면 값 10으로 처리합니다. 최종적으로 전체 합을 11로 나눈 나머지가 0이면 유효한 ISBN으로 판정합니다. 위 예제의 "002442142X"는 이 조건을 만족하지 못하므로 유효하지 않은 ISBN으로 출력됩니다.