Bleeding edge

[프로그래머스] 주차 요금 계산 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 주차 요금 계산 - 자바스크립트

codevil 2022. 5. 10. 23:13

30분정도 걸려서 푼거같다. 문제를 제대로 읽었다면 25분 걸렸을꺼 같다

https://programmers.co.kr/learn/courses/30/lessons/92341

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

문제의 풀이 플로우는 다음과같이 짰다.

1. 차의 내역을 기록하는, new Map()을 만든다.

2. 차의 출입내역을 for문으로 돌린다.

3. 출입내역의 state가 IN일 때

--1]만일, 차 입장 내역이 없다면(map.get으로 체크)

----[입장시간||out상태, 0] value로 입력한다

--2]만일 값이 있다고하면,

----[입장시간||out상태, 현재까지 이용한시간]로 value를 입력한다

  출입내역의 state가 OUT일 때

--나가는시간 - 입장한시간의 값과 현재까지 이용한 시간의 합을, 현재까지 이용한 시간에 넣는다.

이때 주의할 것은, 입장한 시간의 경우에는 Number화 시켜서 h*60 + m을 계산하여아하니, 이것을 계산해서 대입

4. 나간 기록이 없으면 23:59분에 나간 것으로 처리하기위해 for문을 한번 더 돌리면서 만일 value의 입장시간이 out이 아니라고하면, 23:59분으로 다시한번 3번과정을 반복한다.

5. 주차요금 계산을 하기 위하여, value값을 기본요금 + (이용시간-기본시간)/단위시간*기본시간으로 계산한다. 이때 주의할 것은, 이용시간이 기본시간보다 작다고하면, value는 기본요금이 되고, (이용시간-기본시간)/단위시간이, 나누어 떨어지지 않으면 Math.ceil로 올린다.

6. list를 Array.from화 시킨뒤 0번째 값을 기준으로 sort시킨다(차번 오름차순으로 정렬)

7. map v[1]로 마무리를 한뒤 return한다.

function solution(fees, records) {
    const [basicT,basicM, scaleT,scaleM] =fees
    let list = new Map()
    for(let i=0;i<records.length;i++){
        const [time, car, state] = records[i].split(" ")
        if(state==="IN"){
        if(!list.get(car)){
           list.set(car, [time, 0])
           }else{
               const [lasttime, savetime] = list.get(car)
               list.set(car, [time, savetime])
           }
        }else if(state==="OUT"){
            const [lasttime, savetime] = list.get(car)
            list.set(car, ['out', savetime+tc(time)-tc(lasttime)])
        }
    }
    for(let key of list.keys()){
        const [lasttime, savetime] = list.get(key)
        if(lasttime!=='out'){
            list.set(key, ['out', savetime+tc('23:59')-tc(lasttime)])
        }
    }
    let answer = Array.from(list)
    for(let i=0;i<answer.length;i++){
       
        if(answer[i][1][1]<=basicT){
            answer[i][1] =basicM        
        }else{
            answer[i][1]=basicM + Math.ceil((answer[i][1][1]-basicT)/scaleT)*scaleM
        }
    }
    answer = answer.sort((a,b)=>a[0]-b[0])
    answer = answer.map((v)=>v[1])
    return answer
}
function tc(time){
    const [h, m] = String(time).split(":");
    return Number(h)*60+Number(m)
}

사실 오래전에 풀어본 기억이 있는 문제이다. 그때는 참 어렵게 시도하다가 실패했었는데, 지금은, new Map()을 이용할 수 있게되었고, const [a, b] = list와 같은 것을 잘 사용하게 되어서, 문제를 정리되게 잘 푼거같다. 그리고, 습관적으로 typeof가 string일지라도 String을 시키는 것과 같은 것으로 타입을 정리하여 값을 분명히 하는 게 조금씩 보이면서 풀이를 하는 것이 개선되고 있는 것이 느껴졌다.