-
CS50 Week6: Problem Set, CreditProgramming/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")