Home > Algorithm > BOJ > [BOJ] 14626번 ISBN

[BOJ] 14626번 ISBN
C++ 백준 BOJ 알고리즘 Algorithm

🔗 문제

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


📌 문제 요약

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 13자리 숫자가 입력된다. 훼손된 숫자는 *로 표시한다. (훼손된 일련번호는 체크기호를 제외한 무작위 한 자리이다.)
출력: 훼손된 숫자 *에 알맞은 숫자를 출력한다.


💡 접근 방법

조건에 따라 계산식을 바꿔 적용하도록 해야 한다.
문제에 전체 계산식은 나와있기 때문에 조건만 잘 적용해주면 간단한 문제


⚠️ 처음에 했던 실수

-


💻 코드

#include <iostream>
#include <string>
using namespace std;

string serial;

int main() {
  cin >> serial;

  int size = serial.size();
  int mul3 = false;
  int ans = 0;
  bool targetMul3 = false;
  bool checkSign = true;
  for (int i = 0; i < size - 1; ++i) {

    if (serial[i] == '*') {
      targetMul3 = mul3;
      mul3 = !mul3;
      checkSign = false;
      continue;
    }
    int val = serial[i] - '0';

    if (mul3)
      ans += val * 3;
    else
      ans += val;

    mul3 = !mul3;
  }

  int ret = 0;
  if (checkSign)
    ret = (10 - (ans % 10)) % 10;
  else {
    ret = (10 - (serial[size - 1] - '0')) % 10;

    int mul = targetMul3 ? 3 : 1;
    for (int i = 0; i <= 9; ++i) {
      if (ret == ((i * mul) + ans) % 10) {
        ret = i;
        break;
      }
    }
  }

  cout << ret;
  return 0;
}