cardChecking.js (7kyu 70)

Codewars 알고리즘 풀이


Problem

  • Given a credit card number we can determine who the issuer/vendor is with a few basic knowns.
    • 주어진 신용카드 번호로 발행사를 확인할 수 있다.
  • Complete the function that will use the values showns below to determine the card issuer for a given card number.
    • 아래의 값을 사용해서 카드 발행사를 판단하는 함수를 작성한다.
  • If the number cannot be matched then the function should return the string ‘Unknown’.
    • 일치하는 번호가 없다면, ‘Unknown’을 반환한다.


Values

Card TypeBegins WithNumber Length
AMEX34 or 3715
VISA413 or 16
Mastercard51, 52, 53, 54 or 5516
Discover601116


Solution 01

function cardChecking(cardNum) {
  let cardStr = cardNum.toString();
  
  if (cardStr.match(/^3[4|7]\d{13}$/g)) return 'AMEX';
  if (cardStr.match(/^4(\d{12}|\d{15})$/g)) return 'VISA';
  if (cardStr.match(/^5[1-5]\d{14}$/g)) return 'Mastercard';
  if (cardStr.match(/^6011\d{12}$/g)) return 'Discover';
  
  return 'Unknown';
}

cardChecking(341111111111111);	// AMEX
cardChecking(4111111111111111);	// VISA
cardChecking(5211111111111111);	// Mastercard
cardChecking(6011111111111111);	// Discover
cardChecking(8111111111111111);	// Unknown

toString(): 숫자를 문자열로 변환한다.

match(): 문자열에서 정규식과 일치하는 문자를 검색하고, 배열로 반환한다.

^: 입력의 시작 부분에 대응

$: 입력의 끝 부분에 대응

|: or

\d: 숫자에 대응 (= [0-9])

{n}: 앞의 문자열이 정확히 n번 나타나는 부분에 대응

g: 전역 검색


Solution 02

function cardChecking(cardNum) {
  let cardStr = cardNum.toString();
  
  if (/^3[4|7]\d{13}$/.test(cardStr)) return 'AMEX';
  if (/^4(\d{12}|\d{15})$/.test(cardStr)) return 'VISA';
  if (/^5[1-5]\d{14}$/.test(cardStr)) return 'Mastercard';
  if (/^6011\d{12}$/.test(cardStr)) return 'Discover';
  
  return 'Unknown';
}

cardChecking(341111111111111);	// AMEX
cardChecking(4111111111111111);	// VISA
cardChecking(5211111111111111);	// Mastercard
cardChecking(6011111111111111);	// Discover
cardChecking(8111111111111111);	// Unknown

test(): 대응되는 문자열이 있는지 검색하고, true/false를 반환한다.


Solution 03

function cardChecking(cardNum) {
  const issuers = {
    AMEX: /^3[4|7]\d{13}$/,
    VISA: /^4(\d{12}|\d{15})$/,
    Mastercard: /^5[1-5]\d{14}$/,
    Discover: /^6011\d{12}$/
  };
  
  for (let issuer in issuers) {
    if (issuers[issuer].test(cardNum.toString())) {
      return issuer;
    }
  }
  
  return 'Unknown';
}

cardChecking(341111111111111);	// AMEX
cardChecking(4111111111111111);	// VISA
cardChecking(5211111111111111);	// Mastercard
cardChecking(6011111111111111);	// Discover
cardChecking(8111111111111111);	// Unknown