14726번: 신용카드 판별백준/문제2024. 4. 12. 13:03
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/14726
언어 : Kotlin
문제 설명 :
신용카드는 총 16자리의 숫자로 구성되어 있다. 언뜻 보기에는 무작위로 된 숫자로 구성되어 있는 것 같이 보이지만 그 속에는 하나의 수학적 비밀이 숨겨져 있다. 그중 하나가 카드 번호가 유효 한지 유효하지 않은 지 검사하는 Luhn 공식이다. 그 공식은 다음과 같다.
- 신용카드의 16자리 숫자에서 맨 우측 수부터 세어 홀수 번째 수는 그대로 두고, 짝수 번째 수를 2배로 만든다.
- 2배로 만든 짝수 번째 수가 10 이상인 경우, 각 자리의 숫자를 더하고 그 수로 대체한다.
- 이와 같이 얻은 모든 자리의 수를 더한다.
- 그 합이 10으로 나뉘면 “정당한 번호”(유효)이고 그렇지 않으면 “부당한 번호”(유효하지 않음)로 판정된다.
다음 공식을 이용해 주어진 신용카드의 번호가 유효한지, 유효하지 않은 지 판단해라.
입력 :
첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1000)이 주어진다.
그 다음 줄부터 테스트 케이스에 해당하는 신용카드 번호가 주어진다.
출력 :
신용카드의 번호가 유효하면 “T”, 유효하지 않으면 “F”를 한 줄 씩 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
3 2720992711828767 3444063910462763 6011733895106094 |
T F T |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val t = readLine().toInt()
repeat(t) {
val input = readLine().chunked(1).mapIndexed { index, s ->
if (index % 2 == 0) {
val cur = s.toInt() * 2
if (cur >= 10) cur.toString().chunked(1).sumOf { it.toInt() } else cur
} else {
s.toInt()
}
}.sum()
bw.write(if (input % 10 == 0) "T" else "F")
if (it < t) bw.append("\n")
}
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
3107번: IPv6 (0) | 2024.04.12 |
---|---|
11367번: Report Card Time (0) | 2024.04.12 |
4597번: 패리티 (0) | 2024.04.11 |
10266번: 시계 사진들 (0) | 2024.04.11 |
1515번: 수 이어 쓰기 (0) | 2024.04.11 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!