ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CS50 Week6: Problem Set, Credit
    Programming/CS50 2023. 7. 19. 01:22

    하버드 CS50 강의 6주차 Problem Set 과제 Credit 의 풀이를 다룹니다.
    C언어로 작성했던 같은 프로그램을 Python으로 다시 작성해보는 과제입니다.
    Python의 String Slice와 정규식을 활용하여 풀이했습니다.

    Task

    이전에 C로 구현했던 문제를 똑같이 python으로 재구현하는 문제

    Implementation

    입력 받기

    while True:
        card_num = input("Number: ")
        if card_num.isdigit():
            break

    이번에는 입력을 string으로 받았다. 이후 조작이 더 편리하다.

    Luhn's 알고리즘

    def is_valid_luhn_checksum(card_num):
        checksum = 0
        for digit in card_num[-2::-2]:
            checksum += sum(divmod(2 * int(digit), 10))
        for digit in card_num[::-2]:
            checksum += int(digit)
    
        return checksum % 10 == 0

    card_num[-2::-2]는 뒤에서 부터 두 칸씩 숫자를 가져온다. 물론 엄밀히 말하면 숫자가 아닌 문자열이다.

    몫과 나머지는 divmod를 이용해 한번에 구할 수 있다. 코드가 간단해졌다.

    카드 종류 판별

    if is_valid_luhn_checksum(card_num):
        if re.match(r'^(34|37)\d{13}$', card_num):
            print("AMEX")
        elif re.match(r'^(5[1-5])\d{14}$', card_num):
            print("MASTERCARD")
        elif re.match(r'^(4\d{12}|4\d{15})$', card_num):
            print("VISA")
        else:
            print("INVALID")
    else:
        print("INVALID")

    정규식을 이용하면 조건이 간단해진다.

    Full Code

    import re
    
    def is_valid_luhn_checksum(card_num):
        checksum = 0
        for digit in card_num[-2::-2]:
            checksum += sum(divmod(2 * int(digit), 10))
        for digit in card_num[::-2]:
            checksum += int(digit)
    
        return checksum % 10 == 0
    
    
    
    while True:
        card_num = input("Number: ")
        if card_num.isdigit():
            break
    
    if is_valid_luhn_checksum(card_num):
        if re.match(r'^(34|37)\d{13}$', card_num):
            print("AMEX")
        elif re.match(r'^(5[1-5])\d{14}$', card_num):
            print("MASTERCARD")
        elif re.match(r'^(4\d{12}|4\d{15})$', card_num):
            print("VISA")
        else:
            print("INVALID")
    else:
        print("INVALID")

    댓글