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()
: 지정된 두 인덱스 사이의 문자를 추출하고, 새 문자열로 반환한다.