Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 병합 정렬
- 연결리스트
- 완전탐색
- 기술면접
- 알고리즘
- 정규표현식
- 백준
- Node
- 코딩테스트
- 코테
- 자료구조
- 브루트포스
- useState
- react
- sort
- 딥다이브
- state
- JavaScript
- 리액트
- BOJ
- 해시
- 프로그래머스
- JS
- 자바스크립트
- 정렬
- 최소공배수
- CSS
- 합병 정렬
- node.js
- hash
Archives
- Today
- Total
가치투자자
[프로그래머스] 주차 요금 계산 본문
728x90
반응형
Programmers : 주차 요금 계산
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/92341
</> 이 글은 코딩테스트 대비와 알고리즘 공부를 위해 문제를 풀고 학습한 내용을 기록한 것입니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️
💬 문제
이 문제는 객체 를 활용해 차량번호와 시간, 차량번호와 요금을 연결지으면 되는 구현 문제이다.
고려해줘야 할 것이 많지만, 객체에 대해 이해하고 있다면 충분히 풀 수 있는 문제였다.
- 주차장의 입/출차 내역과 요금표가 주어졌을 때, 차량별 주차 요금을 계산하려고 한다.
- 요금 (정수 배열 fees)
- [기본 시간, 기본 요금, 단위 시간, 단위 요금]
- 기본 시간 이하일 때, 기본 요금이 청구된다
- 기본 시간 초과분에 대해서는 단위 시간마다 단위 요금이 청구된다
- 단위 시간으로 나누어 떨어지지 않으면 올림한다 - 입/출차 내역 (문자열 배열 records)
- "시각 차량번호 내역"
- 입차 후 출차된 내역이 없다면, 23:59에 출차된 것으로 간주한다
- 차량번호는 숫자 4개 번호
- 내역은 IN 또는 OUT - 차량 번호가 작은 순으로 주차 요금을 정수 배열에 담아 출력해주면 된다.
728x90
💡 입출력 예시
2번째 예시를 정리하면 다음과 같다.
차량 3961 = 16시 입차 - 18시 출차, 23시 58분 입차 / 차량 0202 = 16시 입차 - 18시 출차
차량 0202는 120분, 차량 3961은 121분 주차했으므로, 0202는 기본 요금으로 0원이고 3961은 1분 더 주차했으므로 올림해서 총 요금은 591원이다.
3번째 예시에서 차량 1234는 0시 0분에 들어왔지만, 나간 시각이 없기에 23시 59분에 나간 것으로 간주되어 요금은 (1439분 - 1분) / 1분 * 10원 = 14841원이다.
반응형
🔑 풀이1 : 객체
- 요금표를 baseT(기본 시간), baseF(기본 요금), unitT(단위 시간), unitF(단위 요금)으로 구조분해할당 해준다.
- records를 clock(시각), num(차량 번호), record(내역)으로 할당해준다.
- 시각(clock)도 분해하여 분(min) 단위로 변환해준다(time) - 입/출차 내역
- 차량이 들어왔으면, carIn에 num과 time을 쌍으로 넣어준다
- 차량이 나왔을 때, 이전에 누적된 시간이 carOut에 있다면 거기에다가 더해준다
- 차량이 나왔을 때, 이전에 누적된 시간이 없다면 주차한 시간을 carOut에 넣어주고, carIn에서는 제거해준다 - 주차는 했지만 출차하지 않은 차량
- 23시 59분에 출차한 것으로 간주해 주차 시간을 carOut에 추가해준다 - [차량번호, 주차 시간] 형식으로 이차원 배열로 바꾼 뒤, 차량 번호를 기준으로 오름차순으로 정렬해준다.
- 요금 계산
- 기본 시간보다 짧게 주차했으면 기본 요금을, 그것보다 길게 주차했으면 초과분을 계산해 주차 요금을 정산해준다
- 기본 시간으로 나눴을 때, 나머지는 올림해준다
function solution(fees, records) {
const answer = [];
const carIn = {};
let carOut = {};
const [baseT, baseF, unitT, unitF] = fees;
// 시간 계산
records.map((item) => {
const [clock, num, record] = item.split(' ');
const [hour, min] = clock.split(':');
const time = parseInt(hour) * 60 + parseInt(min);
if (record === 'IN') {
carIn[num] = time;
} else {
carOut.hasOwnProperty(num)
? carOut[num] = carOut[num] + time - carIn[num]
: carOut[num] = time - carIn[num];
delete carIn[num];
}
});
// 오늘 출차하지 않은 차량
for (const [num, time] of Object.entries(carIn)) {
carOut.hasOwnProperty(num)
? carOut[num] = carOut[num] + 1439 - time
: carOut[num] = 1439 - time;
delete carIn[num];
}
// 차량번호 오름차순 정렬
carOut = Object.entries(carOut).sort((a,b) => a[0] - b[0]);
// 요금 계산
carOut.map((item) => {
const time = item[1];
answer.push(
time <= baseT
? baseF
: baseF + Math.ceil((time - baseT) / unitT) * unitF
);
})
return answer;
}
실행 결과와 채점 결과는 다음과 같다.
728x90
반응형
'Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (0) | 2023.07.13 |
---|---|
[프로그래머스] n진수 게임 (0) | 2023.07.12 |
[프로그래머스] 다트 게임 (0) | 2023.07.06 |
[프로그래머스] k진수에서 소수 개수 구하기 (0) | 2023.07.05 |
[프로그래머스] 실패율 (0) | 2023.06.29 |