반응형
프로그래머스 lv2 주차 요금 계산
레벨: 2
언어: JavaScript
문제 설명
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다.
주차 입차와 출차의 기록이 여러번 일때에는 주차시간의 누적으로 하여 요금을 계산합니다.
입차는 있고 출차 기록이 없는 차량은 23:59에 출차한 것으로 간주합니다.
입력 값
- fees: 주차장의 요금표
- records: 입/출차 기록
출력 값
- result: 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수로 담은 배열
📑풀이 아이디어
- 객체에 차량의 정보를 담고 입차 후 출차가 되면 총 시간을 계산한다.
- 입차 후 출차가 없는 정보는 23:59으로 출차된 것으로 하여 총 시간을 계산한다.
- 계산된 시간을 요금표에 맞게 요금을 계산한다.
📋풀이 코드
function solution(fees, records) {
let answer = [];
let obj = {};
records.map((el) => {
let [parkingTime, num, state] = el.split(" ");
if (state === "IN") {
if (num in obj) {
obj[num] = {
...obj[num],
time: transMin(parkingTime),
state,
};
} else {
obj[num] = {
time: transMin(parkingTime),
state,
totalTime: 0,
};
}
} else {
obj[num].totalTime += transMin(parkingTime) - obj[num].time;
obj[num] = {
...obj[num],
time: transMin(parkingTime),
state,
};
}
});
for (const key in obj) {
if (obj[key].state === "IN") {
obj[key].totalTime += transMin("23:59") - obj[key].time;
}
obj[key].fee = culFee(fees, obj[key].totalTime);
}
Object.keys(obj)
.sort()
.map((el) => {
answer.push(obj[el].fee);
});
return answer;
}
const transMin = (time) => {
let [hour, min] = time.split(":");
return hour * 60 + +min;
};
const culFee = (fees, totalTime) => {
let [defaultTime, defaultFee, unitTime, unitFee] = fees;
let culTime = totalTime - defaultTime;
return culTime < -1
? defaultFee
: defaultFee + Math.ceil(culTime / unitTime) * unitFee;
};
함수 설명
const transMin = (time) => {
let [hour, min] = time.split(":");
return hour * 60 + +min;
};
- "09:00" 형태로 들어오는 문자열 시간을 숫자분으로 바꿔주는 함수이다.
const culFee = (fees, totalTime) => { let [defaultTime, defaultFee, unitTime, unitFee] = fees; let culTime = totalTime - defaultTime; return culTime < 1 ? defaultFee : defaultFee + Math.ceil(culTime / unitTime) * unitFee; };
- 요금표를 받와 총 시간을 매개변수로 받고 요금을 계산하는 함수이다.
- 총 시간에 기본시간을 뺀 값이 1보다 작으면 기본요금을 반환한다.
- 1보다 크면 (기본요금 + | 기본시간을 제외한 시간 / 단위 시간| * 단위요금) 으로 계산하여 총 요금을 반환한다.
코드 설명
if (state === "IN") { // 1
if (num in obj) { //2
obj[num] = {
...obj[num],
time: transMin(parkingTime),
state,
};
} else { //3
obj[num] = {
time: transMin(parkingTime),
state,
totalTime: 0,
};
}
}
- 차의 주차 상태(state)이 'IN' 일때
- 이미 obj들어와 있는 차가 있다면 totalTime은 그대로 두고 time(입차시간)과 state(주차상태)를 변경한다.
- obj에 있지 않은 차이면 time, state를 기록하고 totalTime을 0으로 초기화한다.
obj 안에는 차 번호를 key로 가지는 객체가 저장된다. 아래의 예시와 같다.
obj = {0000:{time: 334, state: 'IN', totalTime:0}}, ....
else {
obj[num].totalTime += transMin(parkingTime) - obj[num].time;
obj[num] = {
...obj[num],
time: transMin(parkingTime),
state,
};
- 차가 출차한 경우 총 있던 시간을 계산하여 obj에 저장해준다.
for (const key in obj) {
if (obj[key].state === "IN") {
obj[key].totalTime += transMin("23:59") - obj[key].time;
}
obj[key].fee = culFee(fees, obj[key].totalTime); // 요금계산 함수
}
- obj를 for in 문을 사용하여 요금을 계산한다.
- 상태가 'IN' 인 차량은 조건에 맞게 출차시간을 23:59으로하여 총 시간을 계산한다.
Object.keys(obj) .sort() .map((el) => { answer.push(obj[el].fee); });
- 차량의 번호가 낮은 순서대로 정렬하여 요금 값을 정답 배열에 넣는다.
- obj의 key가 차량의 번호이니 Object.key 함수를 사용하여 sort 해준다.
풀이를 보지 않고 풀어보았다. 시간이 많이 걸렸지만 혼자서 풀 수 있었다.
그리고 문제를 잘 못 읽어서 누적하는 것을 보지 못하여 시간이 더 오래 걸렸다.
다음번에는 문제를 더 자세히 읽고 푸는 시간을 줄여보자!
언제나 더 좋은 방법이나 틀린 부분은 지적 바랍니다.
반응형
'지난 글 모음' 카테고리의 다른 글
[프로그래머스] LV2 메뉴 리뉴얼 JavaScript (0) | 2022.01.27 |
---|---|
[React Hooks] input onChange 사용법 (onChange)사용 예시 (0) | 2022.01.26 |
[프로그래머스] LV2 기능 개발 스택/큐 JavaScript (1) | 2022.01.25 |
AWS EC2 서버 구매, 접속방법 (0) | 2022.01.24 |
[JavaScript] - 원시 값과 참조 값 (0) | 2022.01.24 |