driver.js (7kyu 99)

Codewars 알고리즘 풀이


Problem

  • The UK driving number is made up from the personal details of the driver.
    • UK 운전면허 번호는 운전자의 개인 정보로 구성된다.
  • Your task is to code a UK driving license number using an array of data.
    • 데이터 배열을 사용해서, UK 운전면허 번호를 반환한다.


For example:

[‘Sam’, ‘Daniel’, ‘Azor’, ‘23-Dec-1990’, M]


  • You will need to output the full 16 digit driving license number.
    • 전체 16자리 운전면허 번호를 출력한다.
  • The individual letters and digits can be code using the below information.
    • 각 글자와 숫자는 아래 정보를 사용해서 반환할 수 있다.


Rules

1-5:

The first five characters of the surname (padded with 9s if less than 5 characters)

성의 처음 다섯 글자 (5 글자 미만인 경우는 9로 채운다)

6:

The decade digit from the year of birth (e.g. for 1987 it would be 8)

출생년도의 10년 단위 (예: 1987은 8)

7-8:

The month of birth (7th character incremented by 5 if driver is female i.e. 51-62 instead of 01-12)

태어난 달 (운전자가 여성인 경우, 7번째 문자가 5만큼 증가한다. 즉, 01-12 대신 51-62)

9-10:

The date within the month of birth

태어난 달의 날짜

11:

They year digit from the year of birth (e.g. for 1987 it would be 7)

출생년도의 1년 단위 (예: 1987은 7)

12-13:

The first two initials of the first name and middle name, padded with a 9 if no middle name

가운데 이름이 없는 경우, 이름과 가운데 이름의 첫 두 글자를 9로 채운다.

14:

Arbitrary digit - usually 9, but decremented to differentiate drivers with the first 13 characters in common. We will always use 9.

임의의 숫자는 대개 9이다. 우리는 항상 9를 사용한다.

15-16:

Two computer check digits. We will always use ‘AA’.

두 개의 컴퓨터 체크 숫자이다. 우리는 항상 ‘AA’를 사용한다.


Solution 01

function driver(arr) {
  let lastName = (arr[2].slice(0, 5).toUpperCase() + '99999').slice(0, 5);
  let dateOfBirth = new Date(arr[3]);
  let decade = dateOfBirth.getFullYear().toString()[2];
  let month = arr[4] === 'M' ? ('0' + (dateOfBirth.getMonth() + 1).toString()).slice(-2) : dateOfBirth.getMonth() + 51;
  let day = dateOfBirth.getDate().toString().slice(-2);
  let year = dateOfBirth.getFullYear().toString().slice(-1);
  let inits = arr[0][0] + (arr[1] === '' ? '9' : arr[1][0]);
  let just = '9AA';
  
  return lastName + decade + month + day + year + inits + just;
}

driver(['Sam', 'Daniel', 'Azor', '23-Dec-1990', 'M']);  // AZOR9912230SD9AA
driver(['Leo', '', 'Song', '30-Apr-1994', 'M']);        // SONG9904304L99AA
driver(['Mary', '', 'Song', '16-Jul-1990', 'W']);       // SONG9957160M99AA
driver(['Coco', '', 'Song', '15-Apr-1988', 'M']);       // SONG9804158C99AA

slice(): 문자열/배열의 일부를 추출하고, 새 문자열/배열로 반환한다.

toUpperCase(): 문자열을 대문자로 변환한다.

getFullYear(): 지정된 날짜의 연도(4 digits for dates between 1000 and 9999)를 반환한다.

getMonth(): 지정된 날짜의 월(from 0 to 11)을 반환한다.

getDate(): 지정된 날짜의 일(from 1 to 31)을 반환한다.

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


Solution 02

function driver(arr) {
  let dateOfBirth = new Date(arr[3]);
  let month = dateOfBirth.getMonth() + 1 + (arr[4] === 'M' ? 0 : 50);
  let result = '';
  
  result += (arr[2] + '99999').substring(0, 5).toUpperCase();
  result += arr[3].substring(arr[3].length - 2, arr[3].length - 1);
  result += month < 10 ? `0${month}` : `${month}`;
  result += arr[3].substring(0, 2);
  result += arr[3].substring(arr[3].length - 1, arr[3].length);
  result += arr[0][0] + (arr[1] === '' ? '9' : arr[1][0]);
  result += '9AA';
  
  return result;
}

driver(['Sam', 'Daniel', 'Azor', '23-Dec-1990', 'M']);  // AZOR9912230SD9AA
driver(['Leo', '', 'Song', '30-Apr-1994', 'M']);        // SONG9904304L99AA
driver(['Mary', '', 'Song', '16-Jul-1990', 'W']);       // SONG9957160M99AA
driver(['Coco', '', 'Song', '15-Apr-1988', 'M']);       // SONG9804158C99AA

substring(): 지정된 두 인덱스 사이의 문자를 추출하고, 새 문자열로 반환한다.