⌨️ Algorithms/백준
[Python] 백준 14726번_신용카드 판별
monzheld
2023. 3. 20. 20:01
https://www.acmicpc.net/problem/14726
14726번: 신용카드 판별
신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보이지만 그 속에는 하나의 수학적 비밀이 숨겨져 있다. 그중 하나가 카드 번호가 유효
www.acmicpc.net
- 신용카드는 총 16자리의 숫자로 구성되어 있음
- 카드 번호가 유효 한지 유효하지 않은 지 검사하는 Luhn 공식
- 1) 신용카드의 16자리 숫자에서 맨 우측 수부터 세어 홀수 번째 수는 그대로 두고, 짝수 번째 수를 2배로 만듦
- 2) 2배로 만든 짝수 번째 수가 10 이상인 경우, 각 자리의 숫자를 더하고 그 수로 대체함
- 3) 이와 같이 얻은 모든 자리의 수를 더함
- 4) 그 합이 10으로 나뉘면 “정당한 번호”(유효)이고 그렇지 않으면 “부당한 번호”(유효하지 않음)로 판정
- 다음 공식을 이용해 주어진 신용카드의 번호가 유효한지, 유효하지 않은 지 판단하기
- 입력
- 첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1000)이 주어짐
- 그 다음 줄부터 테스트 케이스에 해당하는 신용카드 번호가 주어짐
- 출력
- 신용카드의 번호가 유효하면 “T”, 유효하지 않으면 “F”를 한 줄 씩 출력
- 시간 제한: 1초
- 메모리 제한: 128 MB
"""
입출력 예시)
3
2720992711828767
3444063910462763
6011733895106094
-> T
F
T
"""
## 의사코드 ##
# 맨 우측 수부터 세어 홀수 번째 수는 그대로 두고, 짝수 번째 수를 2배로
# => 왼쪽부터 홀수 번째 수를 2배
# 카드 번호는 총 16자리
# card = list(str(input()))
# for i in range(0, 15, 2):
# card[i] = str(int(card[i]) * 2)
# # 2배로 만든 짝수 번째 수가 10 이상인 경우, 각 자리의 숫자를 더하고 그 수로 대체
# if int(card[i]) >= 10:
# card[i] = str(sum(map(int, str(card[i]))))
# 모든 자리의 수 더하기
# total = sum(map(int, card))
# 그 합이 10으로 나뉘면 “정당한 번호”(유효)이고 그렇지 않으면 “부당한 번호”(유효하지 않음)
# print("T" if total % 10 == 0 else "F")
통과한 코드
t = int(input())
for _ in range(t):
card = list(str(input()))
# 16자리 숫자에서 맨 우측 수부터 세어 홀수 번째 수는 그대로 두고, 짝수 번째 수를 2배로 만들기 = 왼쪽부터 홀수 번째
for i in range(0, 15, 2):
card[i] = str(int(card[i]) * 2)
# 2배로 만든 짝수 번째 수가 10 이상인 경우, 각 자리의 숫자를 더하고 그 수로 대체
if int(card[i]) >= 10:
card[i] = str(sum(map(int, str(card[i]))))
# 모든 자리의 수 더하기
total = sum(map(int, card))
# 그 합이 10으로 나뉘면 “정당한 번호”(유효)이고 그렇지 않으면 “부당한 번호”(유효하지 않음)
print("T" if total % 10 == 0 else "F")
- 숫자의 각 자릿수를 분리해서 더하기
- sum(map(int, str(num))
- 과정 확인
'2720992711828767'
"""
card[i]: 2
replaced card[i]: 4
card[i]: 2
replaced card[i]: 4
card[i]: 9
replaced card[i]: 18
sum replaced card[i]: 9
card[i]: 2
replaced card[i]: 4
card[i]: 1
replaced card[i]: 2
card[i]: 8
replaced card[i]: 16
sum replaced card[i]: 7
card[i]: 8
replaced card[i]: 16
sum replaced card[i]: 7
card[i]: 6
replaced card[i]: 12
sum replaced card[i]: 3
final card num: ['4', '7', '4', '0', '9', '9', '4', '7', '2', '1', '7', '2', '7', '7', '3', '7']
total: 80
T
"""
참고)
https://go-hard.tistory.com/96
[python] 파이썬 각 자리수 분리, 더하기
파이썬에서 각 자리숫자를 분리하는 방법은 여러가지가 있으며, 소개해드릴 방법은 문자열로 변환 후 분리하는 방법, 10으로 나누어서 수행하는 방법, map함수를 이용하여 자리수 별 더하는 방법
go-hard.tistory.com
[BaekJoon] 14726번 : 신용카드 판별 (Python)
코딩 1일 1문제! 오늘의 문제는 백준의 신용카드 판별 입니다. 14726번: 신용카드 판별 신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보
somjang.tistory.com