1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
기본요금과 추가요금이 주어졌을 때, 차가 들어온 시각과 나간 시각을 배열로 받아 차량번호 순으로 요금을 반환하는 문제이다.
2. 최종 코드
forEach문에서 차량 정보를 순회하며, 차가 들어왔을 경우 inTime 객체에 들어온 시각을 저장하고 나갈 경우 inTime 객체에 해당 정보를 지우고 times 객체에 경과된 시간을 저장한다.
배열 순회가 끝난 후 inTime 객체를 순회하며, 만약 객체 내 key 값에 해당하는 value값이 false가 아닐 경우 11시59분까지 주차한 것으로 간주하여 추가시간을 더하여 times 객체에 저장한다.
그리고 times 객체의 key와 inTime 객체에 남아있는 key는 일치하므로, inTime 객체를 순회할 때 times 객체의 value를 가져와 요금을 계산하는 것도 같이 할 수 있도록 하였다.
function solution(fees, records) {
const inTime = new Object();
const times = new Object();
records.forEach((cur) => {
cur = cur.split(" ");
cur[0] = cur[0].split(":").map((i) => Number(i));
if (cur[2] == "IN") {
inTime[cur[1]] = [cur[0], cur[2]];
} else {
const time =
cur[0][0] * 60 +
cur[0][1] -
(inTime[cur[1]][0][0] * 60 + inTime[cur[1]][0][1]);
times[cur[1]] = times[cur[1]] ? times[cur[1]] + time : time;
inTime[cur[1]] = false;
}
});
let arr = [];
for (key of Object.keys(inTime)) {
if (inTime[key]) {
const time = 24 * 60 - 1 - (inTime[key][0][0] * 60 + inTime[key][0][1]);
times[key] = times[key] ? times[key] + time : time;
}
if (times[key] > fees[0]) {
arr.push([
key,
fees[1] + Math.ceil((times[key] - fees[0]) / fees[2]) * fees[3],
]);
} else {
arr.push([key, fees[1]]);
}
}
return arr.sort().map((cur) => cur[1]);
}
3. 다른사람의 풀이
테스트는 통과를 했는데 이게 맞나...싶은(?) 맘에 들지않는 코드가 나와서 다른사람의 풀이를 찾아봤다.
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]);
}
내 답안의 경우 주차 시작 시을 저장하는 객체와 총 시간을 저장하는 객체를 각각 만들었는데, 여기서는 parkingTime에 주차시간을 저장하고, in일 때에는 1439(24시간)-time을 더하고, out일때는 빼는 방법을 썼다. 진짜 천재같다
그 외에는 비슷비슷한듯..
'TIL' 카테고리의 다른 글
TIL 240711 - 알고리즘 코드카타 리뷰 - 모음사전 (0) | 2024.07.12 |
---|---|
TIL 240710 - 캐시 & 메모리 (1) | 2024.07.10 |
TIL 240708 - class-validator, custom validator (0) | 2024.07.08 |
TIL 240705 - 알고리즘 코드카타 리뷰 - 타겟 넘버 (0) | 2024.07.05 |
TIL 240704 - UpdateValuesMissingError 에러해결 / Isolation Level 적용 (0) | 2024.07.04 |