[백준/파이썬] 14626번: ISBN

수박강아지·2025년 6월 18일

BAEKJOON

목록 보기
96/174

문제

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

풀이

  • 13자리의 ISBN 번호에서 훼손된 숫자(*) 올바른 숫자로 출력
    • 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 이다.

훼손된 숫자의 위치를 찾고 해당 위치에 0~9까지 수를 모두 집어넣어 위 공식과 맞을 때 수를 출력해주면 됩니다.

weight = [1 if i % 2 == 0 else 3 for i in range(12)]
  • 마지막 숫자(m)을 제외한 앞의 수들의 가중치
damaged = isbn.index('*')
total = 0 # 가중치를 곱한 총합

for i in range(12):
    if i == damaged:
        continue
    total += int(isbn[i]) * weight[i]
  • 훼손된 숫자의 위치를 찾고 이 부분을 제외한 나머지 부분의 숫자를 모두 가중치에 곱해줍니다.
for j in range(10): # 0~9
    tmp = j * weight[damaged] + total # 숫자 * 가중치 + 총합
    m = int(isbn[-1]) # ISBN 마지막 숫자
    if (tmp + m) % 10 == 0: # 숫자가 유효하다면
        print(j) # 출력
        break
  • 훼손된 부분의 올바른 값을 찾아줍니다.

코드

import sys
input = sys.stdin.readline

isbn = input().rstrip()

weight = [1 if i % 2 == 0 else 3 for i in range(12)]
damaged = isbn.index('*')
total = 0

for i in range(12):
    if i == damaged:
        continue
    total += int(isbn[i]) * weight[i]
    
for j in range(10):
    tmp = j * weight[damaged] + total
    m = int(isbn[-1])
    if (tmp + m) % 10 == 0:
        print(j)
        break

0개의 댓글