작성일 :

문제 링크

14626번 - ISBN

설명

13자리 ISBN에서 체크기호를 포함한 숫자 하나가 *로 훼손되어 있을 때, 가중치 규칙을 만족하는 원래 숫자를 찾는 문제입니다.


접근법

각 자리의 가중치는 앞에서부터 1, 3, 1, 3, … 이며, 마지막 체크기호 자리도 같은 합에 포함됩니다.
알려진 자리들의 가중 합을 먼저 구한 뒤, * 자리에 0부터 9까지 넣어 보면서 전체 합을 10으로 나눈 나머지가 0이 되는 값을 찾으면 됩니다.

가능한 숫자는 10개뿐이므로 한 번의 순회와 간단한 확인으로 충분합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;

class Program {
  static void Main() {
    var s = Console.ReadLine()!;
    var sum = 0;
    var star = -1;

    for (var i = 0; i < 13; i++) {
      if (s[i] == '*') {
        star = i;
        continue;
      }
      var d = s[i] - '0';
      var w = (i % 2 == 0) ? 1 : 3;
      sum += d * w;
    }

    var starWeight = (star % 2 == 0) ? 1 : 3;
    for (var x = 0; x <= 9; x++) {
      if ((sum + x * starWeight) % 10 == 0) {
        Console.WriteLine(x);
        return;
      }
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  string s; cin >> s;
  int sum = 0, star = -1;

  for (int i = 0; i < 13; i++) {
    if (s[i] == '*') {
      star = i;
      continue;
    }
    int d = s[i] - '0';
    int w = (i % 2 == 0) ? 1 : 3;
    sum += d * w;
  }

  int star_weight = (star % 2 == 0) ? 1 : 3;
  for (int x = 0; x <= 9; x++) {
    if ((sum + x * star_weight) % 10 == 0) {
      cout << x << "\n";
      return 0;
    }
  }

  return 0;
}

Tags: 14626, BOJ, C#, C++, 구현, 백준, 수학, 알고리즘

Categories: ,