현인
[프로그래머스] 주차 요금 계산 with JS 본문
알고리즘 스프린트 4일차 - [프로그래머스] Lv 2. 주차 요금 계산 (카카오 기출)
https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=javascript
소요시간
40분 생각보다 코드 타이핑이 오래걸렸다
계획
차량 번호가 10000개니까 배열 두 개 만들어서 하나는 입출고 시간 적는 배열, 하나는 누적시간 담는 배열로 만들어서 풀면 될 것 같다고 생각함
풀이
카카오가 문자열 다루는 구현 문제를 이렇게 내는 경우가 많은데 사실 고민해보면 Lv2 정도는 아닌 느낌이 든다...
각설하고,
- 입고 시간을 저장하는 배열과 누적시간을 담는 배열 두 개를 만들어서
- 차량 번호를 배열의 인덱스로 사용한다
- 차량이 입고 하면 입고 배열에 시간을 기록하고, 출고하면 입고 배열을 초기화하고 누적시간 배열을 증가시킨다
- 누적시간을 기록하고 계산하기 편하게 분 단위로 기록하였고 따라서 분 단위로 계산해주는 함수를 작성했다
- 전체 가격을 계산하는 함수도 따로 작성하였다
- 위 와 같이 함으로써 코드를 작성함에 불편함을 없도록 하였으나 걸린 시간만 따지면 비슷하긴 하다
결과
코드
function timeToNum(time){
let t = time.split(':');
let result = 0;
result += parseInt(t[0]) * 60 + parseInt(t[1]);
return result;
}
function calcCost(sum, fees){
if (sum > fees[0]){
return fees[1] + Math.ceil((sum - fees[0]) / fees[2]) * fees[3];
}
else{
return fees[1]
}
}
function solution(fees, records) {
var answer = [];
let times = [];
let sum = [];
for (let i = 0; i < 10000; i++){
times.push(-1);
sum.push(0);
}
//temp : "16:00 3961 IN"
for (let i = 0; i < records.length; i++){
let temp = records[i].split(' ');
if(temp[2] == "IN"){
times[parseInt(temp[1])] = timeToNum(temp[0]);
}
else{
sum[parseInt(temp[1])] += timeToNum(temp[0]) - times[parseInt(temp[1])];
times[parseInt(temp[1])] = -1;
}
}
for (let i = 0; i < 10000; i++){
if (times[i] != -1){
sum[i] += 1439 - times[i];
}
}
for (let i = 0; i < 10000; i++){
if (sum[i] != 0){
answer.push(calcCost(sum[i], fees))
}
}
return answer;
}
마치며
문자열 다루기 문제들은 문자열과 관련된 함수들을 잘 알고 있어야 풀 수 있다. 이번 문제에서는 split이나 parseInt가 중요했다. 문자열 뿐만 아니라 Math의 함수인 ceil() 함수도 알고 있어야 풀 수 있었다. 아니면 뭐 직접계산해도 되긴하지만.. 알고 있으면 편하니까..! 간만에 슴슴한 구현 문제라서 덤덤하게 풀었다
'알고리즘' 카테고리의 다른 글
[프로그래머스] 양궁대회 with JS (0) | 2023.03.29 |
---|---|
[프로그래머스] 카카오 프렌즈 컬러링북 with Java (0) | 2023.03.29 |
[프로그래머스] 두 큐 합 같게 만들기 with JS (0) | 2023.03.25 |
[프로그래머스] 이모티콘 할인행사 with JS (0) | 2023.03.24 |
[프로그래머스] 택배배달과 수거하기 with JS (0) | 2023.03.24 |