C++
1트라이
// boj14626
#include <iostream>
#include <string>
using namespace std;
int main() {
string pin;
cin >> pin;
// cout << "입력값: " << pin << endl;
int res; // 정답 (*)
int s = pin[12] - '0'; // 숫자합 계산할 임시값
int tweight; // res에 곱해져야하는 가중치
for (int i = 0; i < 12; i++) {
int weight = 1; // pin[i]에 곱해지는 가중치 (짝수1, 홀수3)
if (i % 2 == 1)
weight *= 3;
if (pin[i] == '*') {
tweight = weight;
continue;
}
s += (pin[i] - '0') * weight;
}
int need = 10 - (s % 10); // 10으로 나눠떨어지기 위해 더해야하는 수
res = need / tweight;
cout << res ;
return 0;
}
13자리 숫자를 pin 변수로 입력받고 각 자리의 번호와 가중치(0번째1, 1번째3,…)를 곱한 합 s를 계산.
여기서 훼손 *번호는 continue 했기 때문에 s에는 훼손번호 res와 그 가중치 tweight가 제외된 값임
문제점
need 구하기 need = 10 - (s % 10)
숫자합이 10으로 나눠 떨어지기 위해 더해야 할 수를 구해했었지만
s % 10 == 0 인경우 0으로 계산되어야하는 need가 10이 되어버린다.
따라서 나머지 연산을 한번 더 할필요가 있음
int need = (10 - (s % 10)) % 10;
res * 3 은 10이상이 될수도 있음. 즉 res * 3 == need가 항상 성립하는건 아니기 때문에
res = need / tweight;
이렇게 단순히 나누면 안됨
그 대신 필요한게 모듈러의 곱셈 역원