새소식

⌨️ Algorithms/백준

[Python] 백준 14726번_신용카드 판별

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

 

https://somjang.tistory.com/entry/BaekJoon-14726%EB%B2%88-%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C-%ED%8C%90%EB%B3%84-Python

 

[BaekJoon] 14726번 : 신용카드 판별 (Python)

코딩 1일 1문제! 오늘의 문제는 백준의 신용카드 판별 입니다. 14726번: 신용카드 판별 신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보

somjang.tistory.com

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!