Luhn

Luhn

보통

소개

Global Verification Authority에서 방금 중대한 임무를 맡게 되었어요. 도시 곳곳에서 온라인 결제부터 안전한 로그인에 이르기까지, 수많은 작업이 신용카드 번호, 계좌 번호, 거래 코드, 추적 ID 같은 숫자 식별자의 정확성에 의존하고 있어요. Luhn 알고리즘은 이런 숫자가 유효하고 오류가 없는지 확인하는 데 쓰이는 간단한 체크섬 공식이에요.

식별자 한 묶음이 막 책상 위에 올라왔어요. 모두 Luhn 검사를 통과해야 정당한 식별자로 인정받을 수 있어요. 하나라도 통과하지 못하면 유효하지 않은 것으로 표시되어, 잘못된 거래나 무단 접근 같은 오류나 사기를 막을 수 있어요.

이 일을 제대로 해낼 수 있을까요? 많은 서비스의 안전이 여러분의 손에 달려 있어요.

지침

신용카드 번호가 룬 공식에 따라 유효한지 판별해요.

숫자는 문자열로 주어져요.

숫자 검증

길이가 1 이하인 문자열은 유효하지 않아요. 입력에는 공백이 들어갈 수 있지만, 검사하기 전에 공백을 제거해야 해요. 그 외의 숫자가 아닌 문자는 모두 허용되지 않아요.

예시 1: 유효한 신용카드 번호

4539 3195 0343 6467

룬 알고리즘의 첫 번째 단계는 오른쪽부터 시작해서 두 번째 자리마다 숫자를 두 배로 만드는 거예요. 두 배로 만들 자리는 다음과 같아요.

4539 3195 0343 6467
↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)

두 배로 만든 값이 9보다 크면 그 결과에서 9를 빼요. 두 배로 만든 결과는 다음과 같아요.

8569 6195 0383 3437

그다음 모든 자릿수를 더해요.

8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80

합이 10으로 나누어떨어지면 그 숫자는 유효해요. 이 숫자는 유효해요!

예시 2: 유효하지 않은 신용카드 번호

8273 1232 7352 0569

오른쪽부터 시작해서 두 번째 자리마다 숫자를 두 배로 만들어요.

7253 2262 5312 0539

자릿수를 모두 더해요.

7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57

57은 10으로 나누어떨어지지 않으므로 이 숫자는 유효하지 않아요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Erlang Exercism

Luhn 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Erlang 트랙을 연습 문제 85개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.

Luhn 깊이 살펴보기!

Luhn의 서로 다른 8가지 버전을 살펴봐요. 아주 깔끔한 Ruby 구현으로 시작해서 명령형과 함수형 접근법을 살펴보고, Erik과 Jeremy가 해독하는 데 꽤 애를 먹은 SQLite 버전으로 마무리해요.