C++

image.png

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가 제외된 값임

문제점

  1. need 구하기 need = 10 - (s % 10)

    숫자합이 10으로 나눠 떨어지기 위해 더해야 할 수를 구해했었지만

    s % 10 == 0 인경우 0으로 계산되어야하는 need가 10이 되어버린다.

    따라서 나머지 연산을 한번 더 할필요가 있음

    int need = (10 - (s % 10)) % 10;

  2. res * 3 은 10이상이 될수도 있음. 즉 res * 3 == need가 항상 성립하는건 아니기 때문에

res = need / tweight; 이렇게 단순히 나누면 안됨

그 대신 필요한게 모듈러의 곱셈 역원