백준 14626번: ISBN [Python]

tomkitcount·2026년 1월 13일

알고리즘

목록 보기
291/304

문제 출처 : https://www.acmicpc.net/problem/14626
난이도 : 브론즈 1


문제 파악

ISBN-13은 총 13자리 숫자로 이루어진 코드이며,
각 자리에 가중치를 곱한 합이 특정 조건을 만족해야 유효한 ISBN이 된다.

규칙은 다음과 같다.

  • 왼쪽부터 1번째, 3번째, 5번째 … (홀수 번째 자리) → 가중치 1
  • 왼쪽부터 2번째, 4번째, 6번째 … (짝수 번째 자리) → 가중치 3
  • 각 자리 숫자에 가중치를 곱해 모두 더한 값이
    10으로 나누어 떨어지면(합 % 10 == 0) 올바른 ISBN이다.

문제에서는 ISBN 13자리 중 딱 한 자리가 *로 가려져 있고
* 자리에 들어갈 숫자(0~9)를 찾아야 한다.


해결 아이디어

* 자리에 들어갈 수 있는 숫자는 0부터 9까지뿐이다.

따라서 가장 단순하게:

  1. 문자열에서 *의 위치를 찾는다.
  2. 0부터 9까지 숫자를 하나씩 대입해본다.
  3. 대입한 상태로 ISBN-13 체크섬을 계산한다.
  4. 합이 10으로 나누어 떨어지는 순간, 그 숫자가 정답이다.

자리 수가 고정(13자리)이고 경우의 수도 10개뿐이라
완전탐색으로 충분히 해결 가능하다.


해답 및 풀이

입력은 문자열로 받아 *의 인덱스를 먼저 찾는다.

이후 0부터 9까지 숫자를 하나씩 넣어보며,
각 자리의 숫자에 맞는 가중치(1 또는 3)를 곱해 총합을 계산한다.

주의할 점은 인덱스 기준이다.
문자열은 0부터 시작하므로:

  • 인덱스가 짝수 → 가중치 1
  • 인덱스가 홀수 → 가중치 3

총합이 10으로 나누어 떨어지면,
그때 대입한 숫자가 *에 들어갈 정답이다.

최종 코드는 다음과 같다.

import sys
input = sys.stdin.readline

s = input().strip()

star_idx = s.index('*') // string.index("s") 메서드를 쓰면 쉽게 특정 문자의 인덱스를 받아올 수 있다.

for d in range(10):
    total = 0
    for i in range(13):
        if i == star_idx:
            digit = d
        else:
            digit = int(s[i])

        if i % 2 == 0:
            total += digit
        else:
            total += digit * 3

    if total % 10 == 0:
        print(d)
        break

별에 들어갈 숫자를 식을 세워서 구현할수도 있겠지만,
0~9를 대입해서 구해본다는 생각이 킥이었던 것 같다.

profile
To make it count

0개의 댓글