객체를 만든 뒤, fe 객체에는 계산된 요금 값들이 더해지고 cnt 객체에는 IN일 때의 시간이 들어간다.
IN일 때, cnt 객체에 사용 시간을 넣는다. (단, 00:00에 들어오는 경우도 있으므로 이때는 구분을 위해 -1로 계산해준다)
OUT일 때, use에서 cnt객체value를 뺀 값을 요금으로 책정한 후, cnt의 value를 0으로 초기화해준다.
cnt 중에 0이 아니라는 건, OUT 하지 않았다는 의미이므로 23:59에 나간 걸로 간주하는 계산을 해준다. -1이라는 의미는 00:00에 IN해서 OUT하지 않았다는 의미.
for let .. in을 통해 순회하면서 요금을 계산해준다.
객첼르 배열로 바꿔준뒤, key값을 기준으로 정렬하고 forEach를 통해 순회하면서 value를 answer 배열에 push해준다.
function solution(fees, records) {
let fe = {};
let cnt = {};
let answer = [];
// 1
for (let i=0; i<records.length; i++) {
records[i]=records[i].split(' ');
if (!fe[records[i]]) fe[records[i][1]]=0;
if (!cnt[records[i]]) cnt[records[i][1]]=0;
}
// 2
for (let i=0; i<records.length; i++) {
let hours = records[i][0].slice(0,2);
let minutes = records[i][0].slice(3,5);
let use = (parseInt(hours, 10)*60) + parseInt(minutes, 10)
if (records[i][2] == 'IN') {
if (use === 0) {
cnt[records[i][1]] = -1;
} else {
cnt[records[i][1]] = use;
}
}
else if (records[i][2] == 'OUT') {
if (cnt[records[i][1]] === -1) {
fe[records[i][1]] += use - cnt[records[i][1]] + 1;
cnt[records[i][1]] = 0;
} else {
fe[records[i][1]] += use - cnt[records[i][1]];
cnt[records[i][1]] = 0;
}
}
}
// 3
for (let x in cnt) {
if (cnt[x] !== 0) {
if (cnt[x] === -1) {
fe[x] += ((23*60)+59);
cnt[x]=0;
} else {
fe[x] += ((23*60)+59) - cnt[x];
cnt[x]=0;
}
}
}
// 4
for (let x in fe) {
if (fe[x] > fees[0]) {
fe[x] = fees[1] + (Math.ceil((fe[x]-fees[0])/fees[2]) * fees[3]);
}
else fe[x] = fees[1];
}
// 5
Object.entries(fe).sort((a,b) => a[0]-b[0]).forEach(a => answer.push(a[1]));
return answer;
}
console.log(
solution([1, 461, 1, 10], ["00:00 1234 IN"]))
나처럼 계속해서 for문을 순회하는 것보다, forEach 문 안에서 Destructuring을 하니까 코드의 가독성이 높아졌다.
function solution(fees, records) {
const parkingTime = {};
records.forEach(r => {
let [time, id, type] = r.split(' ');
let [h, m] = time.split(':');
time = (h * 1) * 60 + (m * 1);
if (!parkingTime[id]) parkingTime[id] = 0;
if (type === 'IN') parkingTime[id] += (1439 - time);
if (type === 'OUT') parkingTime[id] -= (1439 - time);
});
const answer = [];
for (let [car, time] of Object.entries(parkingTime)) {
if (time <= fees[0]) time = fees[1];
else time = Math.ceil((time - fees[0]) / fees[2]) * fees[3] + fees[1]
answer.push([car, time]);
}
return answer.sort((a, b) => a[0] - b[0]).map(v => v[1]);
}
// 차량번호 오름차순으로 청구요금 담아 배열로 리턴
// 청구요금 구하기
// 기본요금 fee[1] + ( 주차시간 - 기본시간fee[0] ) / fee[2] * fee[3]
// 기본시간이내 : 기본요금
// 출차 시간 max = 23:59
// 분 단위는 올림
// 주차시간 구하기
// records.forEach(r => r.split(' ')
// log 객체에 {차번호: 시간} 저장
// IN 이면 + (24시간(분) - 입차시간)
// OUT이면 -(1430 - 출차시간)
// 24시간 = 1440분
// ex) 05:34 (05 * 60) + 34 = 334
console.log(
solution([1, 461, 1, 10], ["00:00 1234 IN"]))