DINKIssTyle (61.♡.73.102)
2025년 7월 22일 PM 03:37 · 수정됨(16:22)


저는 25년 동안 기업들이 지구상에서 가장 진보된 AI 및 자동화 시스템을 구현하도록 도왔습니다.하지만 제가 접해본 가장 강력한 알고리즘 중 하나는 1954년에 만들어졌습니다. Luhn 알고리즘이라고 불리는 이 알고리즘은 전 세계의 거의 모든 신용카드를 조용히 검증합니다. AI도 없고, 데이터도 없고, 클라우드도 없습니다. 순수한 인간의 천재성만 있습니다. 작동 방식은 다음과 같습니다.
1️⃣ 오른쪽에서 두 번째 자리까지 두 배로 늘립니다.
2️⃣ 결과가 9보다 크면 숫자를 나누고 더합니다(14 → 1+4).
3️⃣ 모든 숫자를 더합니다.
4️⃣ 0으로 끝나면 카드가 유효합니다.간단합니다. 눈에 띄지 않습니다. 그리고 여전히 글로벌 규모로 실행됩니다. 제가 자주 말하는 것을 떠올리게 합니다.
---

다행입니다.. 저는 검증 못해요...
import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox
)
def calculate_luhn_checksum(number: str) -> int:
digits = [int(d) for d in number if d.isdigit()]
checksum = 0
double = False
for d in reversed(digits):
if double:
d = d * 2
if d > 9:
d -= 9
checksum += d
double = not double
return checksum % 10
def is_luhn_valid(number: str) -> bool:
return calculate_luhn_checksum(number) == 0
class LuhnChecker(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("룬 알고리즘 체크섬 확인기")
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
self.label = QLabel("번호를 입력하세요:")
self.input_field = QLineEdit()
self.check_button = QPushButton("체크")
self.result_label = QLabel("")
self.check_button.clicked.connect(self.check_luhn)
layout.addWidget(self.label)
layout.addWidget(self.input_field)
layout.addWidget(self.check_button)
layout.addWidget(self.result_label)
self.setLayout(layout)
def check_luhn(self):
number = self.input_field.text().strip()
if not number.isdigit():
QMessageBox.warning(self, "입력 오류", "숫자만 입력해 주세요.")
return
checksum = calculate_luhn_checksum(number)
valid = is_luhn_valid(number)
if valid:
self.result_label.setText(f"✅ 유효한 번호입니다 (체크섬: {checksum})")
else:
self.result_label.setText(f"❌ 유효하지 않은 번호입니다 (체크섬: {checksum})")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = LuhnChecker()
window.show()
sys.exit(app.exec_())
채찍피티로 파이썬 스크립트를 짜보았습니다. 재미있네요 ㅎㅎ
당연하겠지만 주민등록번호는 체크섬 유효하군요 ㅋㅋㅋ
댓글 (13)
-
효효도르는효도를
25.07.22 · 211.♡.66.45
밑에 분이 설명해주실겁니다. -
DDINKIssTyle
작성자
25.07.22 · 61.♡.73.102
#include // atoi
#include // strlen
#include // bool
bool checkLuhn(const char *pPurported)
{
int nSum = 0;
int nDigits = strlen(pPurported);
int nParity = (nDigits-1) % 2;
char cDigit[2] = "\0";
for (int i = nDigits; i > 0 ; i--)
{
cDigit[0] = pPurported[i-1];
int nDigit = atoi(cDigit);
if (nParity == i % 2)
nDigit = nDigit * 2;
nSum += nDigit/10;
nSum += nDigit%10;
}
return 0 == nSum % 10;
}
개발자 분들 읽기 편하게 C국어로 번역한 것도 올려드립니다. -
LLegenD
25.07.22 · 222.♡.87.4
아멕스는 알고리즘을 다른거 쓰나보네요 15자리던데.. ㄷㄷ -
DDINKIssTyle
→ LegenD 작성자
25.07.22 · 61.♡.73.102
한번 계산해봐주세요! 0으로 끝나나 궁금합니다! -
LLegenD
→ DINKIssTyle
25.07.22 · 222.♡.87.4
현재 아멕스카드가 없어서.. 사실 있어도 계산 못할거 같지만요 ㅠㅠ -
케케이엠8
→ DINKIssTyle
25.07.22 · 14.♡.58.74
잘 됩니다. 오른쪽부터 세어서 second digit에 2배하는 것만 유념하면 15자리 카드번호도 통과합니다. -
DDINKIssTyle
→ 케이엠8 작성자
25.07.22 · 61.♡.73.102
파이썬으로 짜서 해보니 재미있네요. 자릿수는 상관이가 없네요. ㅎㅎ -
AA350
25.07.22 · 104.♡.68.24
주민등록번호도 마지막이 체크섬이었죠 -
00sRacco
25.07.22 · 164.♡.222.147
네 저는 현금만 씁니다. -
비비읍
25.07.22 · 116.♡.148.36
장동민은 지니어스 게임에서 16자리 번호 3개 보여주고 공통점을 찾으라고 하면 저공식 찾아낼 것같아요 ㄷㄷ
댓글을 작성하려면 이 필요합니다.