Global Verification Authority에서 막 중대한 임무를 맡게 되었어요. 도시 곳곳에서 온라인 구매부터 안전한 로그인까지, 수많은 작업이 신용카드 번호, 은행 계좌 번호, 거래 코드, 추적 ID 같은 숫자 식별자의 정확성에 의존하고 있어요. Luhn 알고리즘은 잘못 입력한 숫자를 찾아내는 데 도움이 되는 간단한 체크섬 공식이에요.
식별자 한 묶음이 방금 책상 위에 도착했어요. 모두 정당한지 확인하려면 Luhn 검사를 통과해야 해요. 하나라도 통과하지 못하면 유효하지 않음으로 표시되어, 잘못된 거래나 실패한 계좌 인증 같은 실수를 막을 수 있어요.
이 일을 제대로 해낼 수 있을까요? 많은 서비스의 신뢰성이 여러분에게 달려 있어요.
Luhn 공식에 따라 어떤 숫자가 유효한지 판별해요.
숫자는 문자열로 주어져요.
길이가 1 이하인 문자열은 유효하지 않아요. 입력에 공백이 들어 있을 수 있지만, 검사하기 전에 공백을 없애야 해요. 공백을 제외한 다른 숫자가 아닌 문자는 모두 허용되지 않아요.
검사할 번호는 4539 3195 0343 6467이에요.
Luhn 알고리즘의 첫 단계는 숫자의 끝에서 시작해서, 오른쪽에서 두 번째 숫자부터 왼쪽으로 이동하며 두 번째 자리마다 두 배로 만드는 거예요.
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
어떤 숫자를 두 배로 만든 결과가 9보다 크면, 그 결과에서 9를 빼요. 그러면 다음과 같아요:
8569 6195 0383 3437
마지막으로 모든 숫자를 더해요. 합이 10으로 나누어떨어지면 원래 숫자는 유효해요.
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80은 10으로 나누어떨어지므로 4539 3195 0343 6467은 유효해요!
검사할 번호는 066 123 478이에요.
숫자의 끝에서 시작해서, 오른쪽에서 두 번째 숫자부터 왼쪽으로 이동하며 두 번째 자리마다 두 배로 만들어요.
066 123 478
↑ ↑ ↑ ↑ (double these)
어떤 숫자를 두 배로 만든 결과가 9보다 크면, 그 결과에서 9를 빼요. 그러면 다음과 같아요:
036 226 458
숫자들을 더하면 다음과 같아요:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36은 10으로 나누어떨어지지 않으므로 066 123 478은 유효하지 않아요!
Exercism에 가입하고 C++ 트랙을 개념 19개연습 문제 100개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
Luhn의 서로 다른 8가지 버전을 살펴봐요. 아주 깔끔한 Ruby 구현으로 시작해서 명령형과 함수형 접근법을 살펴보고, Erik과 Jeremy가 해독하는 데 꽤 애를 먹은 SQLite 버전으로 마무리해요.