[백준][Python] 14626. ISBN
Bronze Ⅰ 🔗14626. ISBN
📝문제 요약
문제

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자리 숫자가 입력된다. 훼손된 숫자는 *로 표시한다. (훼손된 일련번호는 체크기호를 제외한 무작위 한 자리이다.)
출력
훼손된 숫자 *에 알맞은 숫자를 출력한다.
✏️문제 풀이
- 코드를 입력 받아 해당 코드를 순회하며 가중치를 곱해준 후 모든 값을 더함
- 짝수 인덱스: 그대로 더함
- 홀수 인덱스: 3을 곱해서 더해서 total을 만듦
- (total + x) % 10 == 0 이 되도록 하는 값 x = -total % 10 을 구함
- ‘*‘ 위치에 따라 가중치를 다르게 계산
- 짝수이면: 그 자릿수 = x
- 홀수이면: 그 자릿수 = (7 * x) % 10
코드와 함께 보는 풀이
# 코드를 입력받아 리스트로 저장
code = list(input().strip())
# 체크섬 계산을 위한 총합 변수 초기화
total = 0
# '*' 문자의 위치에 따른 가중치 저장
sqe = 0
# 코드를 순회하며 판별
for idx, num in enumerate(code) :
# *일 경우 sqe에 해당 가중치를 저장하고 다음으로 넘어감
if num == '*' :
sqe = 1 if idx % 2 == 0 else 3
continue
# 인덱스가 짝수일때 가중치 : 1
if idx % 2 == 0:
total += int(num)
# 인덱스가 홀수일때 가중치 : 3
else :
total += int(num) * 3
# 체크섬 값 계산
x = -total % 10
# '*' 문자가 짝수 위치에 있었으면 x를 그대로 사용
if sqe == 1 :
result = x
# '*' 문자가 홀수 위치에 있었으면 (7 * x) % 10을 사용
else :
result = (7 * x) % 10
print(result)
💯제출 코드
code = list(input().strip())
total = 0
sqe = 0
for idx, num in enumerate(code) :
if num == '*' :
sqe = 1 if idx % 2 == 0 else 3
continue
if idx % 2 == 0:
total += int(num)
else :
total += int(num) * 3
x = -total % 10
if sqe == 1 :
result = x
else :
result = (7 * x) % 10
print(result)
댓글남기기