소소한 개발자
[백준] 14726 - 신용카드 판별 본문
문제 링크
14726번: 신용카드 판별
신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보이지만 그 속에는 하나의 수학적 비밀이 숨겨져 있다. 그중 하나가 카드 번호가 유효
www.acmicpc.net
코드
#include <iostream>
bool isluhn(long long int number)
{
int sum = 0;
for (int i = 0; number > 0; i++)
{
int temp = (number % 10) * (i % 2 == 0 ? 1 : 2);
sum += temp % 10 + temp / 10;
number /= 10;
}
return sum % 10 == 0;
}
int main()
{
int n;
std::cin >> n;
while (n--)
{
long long int card;
std::cin >> card;
std::cout << (isluhn(card) ? "T" : "F") << '\n';
}
}
풀이 해설
룬 알고리즘 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
룬 알고리즘 - 위키백과, 우리 모두의 백과사전
룬 알고리즘(Luhn algorithm)은 신용카드 번호 검증에 사용되는 알고리즘이다. 이 알고리즘은 지식재산권의 보호기간이 끝난 퍼블릭 도메인 저작물에 속하며 오늘날 널리 사용되고 있다. ISO/IEC 7812-1
ko.wikipedia.org
이 문제는 룬 알고리즘이라는 특이한 알고리즘을 사용해봤다.
실제 카드 번호를 판별할때 쓰인다 카더라
룬 알고리즘 공식은
1.오른쪽에서 번호를 세며 숫자를 더한다.
2.더할때 2의 배수 자리들은 곱하기 2를 한다.
3.만약 곱하기 2를 한 숫자가 10이상이면 10의 자리와 1의 자리로 더한다
4.위 과정이 다 끝나고 최종적으로 더한 숫자가 10의 배수이면 참 아니면 거짓
백준 예제 입력에 있는
2720992711828767를 예를 들면
1. 7부터 숫자를 센다.
=> 2 + 7 + 2 + 0 + 9 + 9 + 2 + 7 + 1 + 1 + 8 + 2 + 8 + 7 + 6 + 9
2.더할때 2의 배수 자리들은 곱하기 2를 한다.
=> (2 * 2) + 7 + (2 * 2) + 0 + (9 * 2) + 9 + (2 * 2) + 7 + (1 * 2) + 1 + (8 * 2) + 2 + (8 * 2) + 7 + (6 * 2) + 7
3.만약 곱하기 2를 한 숫자가 10이상이면 10의 자리와 1의 자리로 더한다
=> 4 + 7 + 4 + 0 + (1 + 8) + 9 + 4 + 7 + 2 + 1 + (1 + 6) + 2 + (1 + 6) + 7 + (1 + 2) + 7
4.위 과정이 다 끝나고 최종적으로 더한 숫자가 10의 배수이면 참 아니면 거짓
=>80 % 10 == 0
=>참
'온라인 저지 > 백준' 카테고리의 다른 글
[백준] 1388 - 바닥 장식 (0) | 2021.08.05 |
---|---|
[백준] 14730 - 謎紛芥索紀 (Small) (0) | 2021.08.05 |
[백준] 13771 - Presents (0) | 2021.08.01 |
[백준] 2959 - 거북이 (0) | 2021.08.01 |
[백준] 17608 - 막대기 (0) | 2021.08.01 |