🔗 문제
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;
}