programmers

[Programmers Level 2] 주차 요금 계산 Javascript

냠냠맨 2023. 1. 11. 21:49

⚡문제정보

진짜 무서운 점 저게 문제 다 가져온것도아님

문제가 너무너무너무너무너무너무 길고 조건도 세세하지만

귀찮을 뿐.. 어렵지는 않은 조건입니다.

주의할 조건들만 아래에 간략히 적겠습니다.


🙄제한사항

 

1.  주차요금 계산할때 시간이 딱 안떨어지면 올림해서 계산하세요

2. 입차한 데이터는 있는데 출차한 데이터가 없다면 23:59에 나간걸로 취급하세요

3. 기본시간,요금,단위시간,단위요금은 달라집니다.

4. 답은 차량번호를 오름차순으로 만들어서 그 순서로 반환하세요

5. 같은 차량이 여러번 들어왔다 나갈 수 있습니다.

 

주의해야할 조건들은 이정도인 것 같습니다.

굉장히...세세하네요


🔍접근방법

 

Map을 때려넣는다.


🔍나의 풀이

 

function solution(fees, records) {
    let map = new Map()
    let answer = []
    
   
    for(i=0 ; i<records.length ; i++) {
        let sp = records[i].split(" ")
        let timesp = sp[0].split(":")
        let time = (Number(timesp[0])*60) + Number(timesp[1])
        if(!map.get(sp[1])) map.set(sp[1] , [])
        map.get(sp[1]).push([sp[2], time])
    }
    
    let sortmap = new Map([...map].sort((a,b) => a[0] - b[0]))
    
    sortmap.forEach( (value,key,i) => {
        let count = 0
        for(i=0; i<value.length; i++) {
            let val = 0
            if(value[i][0] == "IN" && value?.[i+1]?.[0] == "OUT") {
                val += value[i+1][1] - value[i][1] 
            }
            else if(value[i][0] == "IN" && value?.[i+1]?.[0] != "OUT"){
                val += 1439 - value[i][1]
            }
            count += val
        }
        let result = ( Math.ceil(Math.max(0, count - fees[0])/fees[2]) * fees[3]) 
        answer.push(result + fees[1])
    })

    return answer
}

설명은 다음과 같습니다.

function solution(fees, records) {
    let map = new Map()
    let answer = []
    // 답을 저장할 배열과 데이터를 저장할 map
    
   
    for(i=0 ; i<records.length ; i++) {
        let sp = records[i].split(" ")
        let timesp = sp[0].split(":")
        let time = (Number(timesp[0])*60) + Number(timesp[1])
        if(!map.get(sp[1])) map.set(sp[1] , [])
        map.get(sp[1]).push([sp[2], time])
    }
    
    // 각 요소를 쪼개주고 시간을 분으로 바꿔서 저장해줍니다.
    //만약 처음 만나는 차량번호면 빈배열을 먼저 set해줍니다.
    
    let sortmap = new Map([...map].sort((a,b) => a[0] - b[0]))
    // 차량번호를 오름차순으로 해야하기때문에 sort해줍니다. 
    // sort를 하려면 array로 만들어야해서 array로 만들어주고 다시 map에 넣었어요
    // 늦게 발견한 조건이라 중간에 우겨넣음;
    
    sortmap.forEach( (value,key,i) => {
        let count = 0
        // 각 배열의 요소에 forEach로 접근합니다.
        
        for(i=0; i<value.length; i++) {
            let val = 0
            if(value[i][0] == "IN" && value?.[i+1]?.[0] == "OUT") {
                val += value[i+1][1] - value[i][1] 
            }
            else if(value[i][0] == "IN" && value?.[i+1]?.[0] != "OUT"){
                val += 1439 - value[i][1]
            }
            count += val
        }
        // in out 데이터가 다 있으면 out - in 을 해주고
        // in한 흔적만 있으면 23:59 - in시간을 해서 할당합니다.
        
        let result = ( Math.ceil(Math.max(0, count - fees[0])/fees[2]) * fees[3]) 
        // 주차요금 계산 방식을 요구사항에 맞게 만들어줍니다.
        
        answer.push(result + fees[1])
        // 정답 배열에 주차요금 계산 방식으로 얻은 값과 기본요금을 더해서 push 
    })

    return answer
}

?. 은 옵셔널체이닝연산자입니다.

만약 i+1이 없다면 오류가 발생하기때문에 이를 방지해주기 위해서

옵셔널체이닝연산자를 붙여줬습니다.


🔍다른사람의 풀이

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]);
}

아 맞다 구조분해 할당 

구조분해할당하면 깔끔했는데 항상 코드 짤때는 생각을 못하네요

반응형