작성일 :

문제 링크

14726번 - 신용카드 판별

설명

16자리 카드 번호에 Luhn 공식을 적용해 유효성을 판단하는 문제입니다.


접근법

오른쪽부터 자리 인덱스를 세며 짝수 위치는 2배 처리합니다.

2배 결과가 10 이상이면 자릿수 합으로 바꾸고, 총합이 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
using System;

class Program {
  static void Main() {
    var t = int.Parse(Console.ReadLine()!);
    for (var tc = 0; tc < t; tc++) {
      var s = Console.ReadLine()!;
      var sum = 0;
      var pos = 1;

      for (var i = s.Length - 1; i >= 0; i--, pos++) {
        var d = s[i] - '0';
        if (pos % 2 == 0) {
          d *= 2;
          if (d >= 10) d = d / 10 + d % 10;
        }
        sum += d;
      }

      Console.WriteLine(sum % 10 == 0 ? "T" : "F");
    }
  }
}

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
#include <bits/stdc++.h>
using namespace std;

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

  int t; cin >> t;
  while (t--) {
    string s; cin >> s;
    int sum = 0;
    int pos = 1;

    for (int i = (int)s.size() - 1; i >= 0; i--, pos++) {
      int d = s[i] - '0';
      if (pos % 2 == 0) {
        d *= 2;
        if (d >= 10) d = d / 10 + d % 10;
      }
      sum += d;
    }

    cout << (sum % 10 == 0 ? "T" : "F") << "\n";
  }

  return 0;
}