본문 바로가기
알고리즘

BOJ_14626_ISBN

by 도승이 2021. 7. 18.

문제 이름 : ISBN (14626번)

문제 유형 : 수학, 구현, 사칙연산

작성 언어 : C++

문제

ISBN(International Standard Book Number)은 전 세계 모든 도서에 부여된 고유번호로, 국제 표준 도서번호이다. ISBN에는 국가명, 발행자 등의 정보가 담겨 있으며 13자리의 숫자로 표시된다. 그중 마지막 숫자는 체크기호로 ISBN의 정확성 여부를 점검할 수 있는 숫자이다. 이 체크기호는 일련번호의 앞에서부터 각 자리마다 가중치 1, 3, 1, 3…. 를 곱한 것을 모두 더하고, 그 값을 10으로 나눈 나머지가 0이 되도록 만드는 숫자 m을 사용한다. 수학적으로는 다음과 같다.

ISBN이 abcdefghijklm 일 때, a+3b+c+3d+e+3f+g+3h+i+3j+k+3l+m ≡ 0 (mod 10)

즉, 체크기호 m = 10 - (a+3b+c+3d+e+3f+g+3h+i+3j+k+3l) mod 10 이다.

단, 10으로 나눈 나머지 값이 0일 경우 체크기호는 0이다.

전북대학교 중앙도서관에서 사서로 일하고 있는 영훈이는 책 정리를 하다가 개구쟁이 광현이에 의해서 ISBN이 훼손된 도서들을 발견했다. 광현이때문에 야근해야 하는 불쌍한 영훈이를 위해서 손상된 자리의 숫자를 찾아내는 프로그램을 작성해주자.

입력

ISBN 13자리 숫자가 입력된다. 훼손된 숫자는 *로 표시한다. (훼손된 일련번호는 체크기호를 제외한 무작위 한 자리이다.)

출력

훼손된 숫자 *에 알맞은 숫자를 출력한다.

예제 입력 1

9788968322*73

예제 출력 1

2

 

 

 

풀이 : 쉬운 수학 문제

1 , 3 의 가중치가 반복해서 부여된다. * 을제외한 전부를 구해서 합한뒤, 나누어서 10이되는 * 의 숫자를 복원하면된다.

 

 

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	string str;
	int sum = 0;
	cin >> str;
	int location = str.find('*');
	for(int i=0;i<10;i++)
	{
		sum=0; 
		str[location] = i+'0';
		for(int j=0;j<13;j++)
		{
			if(j%2==1) //가중치있을때 
			{
				sum += (str[j]-'0')*3;
				continue;
			}
			sum += (str[j] - '0');
		}
		if(sum%10 == 0)
		{
			cout << str[location];
			return 0;
		}
	}
}

 

 

https://www.acmicpc.net/problem/14626

 

14626번: ISBN

ISBN(International Standard Book Number)은 전 세계 모든 도서에 부여된 고유번호로, 국제 표준 도서번호이다. ISBN에는 국가명, 발행자 등의 정보가 담겨 있으며 13자리의 숫자로 표시된다. 그중 마지막 숫

www.acmicpc.net

 

'알고리즘' 카테고리의 다른 글

BOJ_14501_퇴사  (0) 2021.07.20
BOJ_11365_!밀비 급일  (0) 2021.07.19
BOJ_17248_물리공부  (0) 2021.07.17
BOJ_1759_암호 만들기  (0) 2021.07.16
BOJ_2579_계단 오르기  (0) 2021.07.15

댓글