๐Ÿ‘’ ๋ญ? JS๋กœ PS๋ฅผ ํ•œ๋‹ค๊ณ ?

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค][JS / Javascript] ์ฃผ์ฐจ ์š”๊ธˆ ๊ณ„์‚ฐ

์„ ๋‹ฌ 2023. 6. 5. 23:01
๋ฐ˜์‘ํ˜•

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

0. getTime ํ•จ์ˆ˜

๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆซ์ž๋ฅผ ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์„ ์ •์˜ํ–ˆ๋‹ค.

 

1. ๋ˆ„์  ์ฃผ์ฐจ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ

records ๊ธฐ๋ก์„ ๋Œ๋ฉฐ ๊ฐ ์ฐจ๋Ÿ‰์˜ ๋ˆ„์  ์ฃผ์ฐจ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.

์ž…์ฐจ -> ์ž…์ฐจ์‹œ๊ฐ„ ๊ธฐ๋ก (lastIn)

์ถœ์ฐจ -> ์ถœ์ฐจ์‹œ๊ฐ„ - ์ž…์ฐจ์‹œ๊ฐ„ ๋”ํ•ด์ฃผ๊ธฐ (totalTime)

์ด๋•Œ, ์ž…์ฐจ๋งŒ ๋˜๊ณ  ์ถœ์ฐจ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์ถœ์ฐจ๋ฅผ ์‹œ์ผฐ๋‹ค๋ฉด ์ž…์ฐจ๊ธฐ๋ก์€ deleteํ•ด์ค€๋‹ค!

 

2. ์ถœ์ฐจ ์•ˆํ•œ ์ฐจ๋Ÿ‰๋“ค ์ฒ˜๋ฆฌ

์ถœ์ฐจ๊ฐ€ ๋˜์—ˆ์œผ๋ฉด lastIn์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ lastIn์„ ์ˆœํšŒํ•˜๋ฉฐ 23:59 - ์ž…์ฐจ์‹œ๊ฐ„ ์„ ๋ˆ„์ ์‹œ๊ฐ„์— ๋”ํ•ด์ค€๋‹ค

 

3. ์š”๊ธˆ ๊ณ„์‚ฐ

totalTime์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์ž๋™์ฐจ๋ณ„ ๋ˆ„์  ๊ธˆ์•ก์„ ๊ตฌํ•ด์„œ ans ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค

4๋ฒˆ๊ณผ์ •์—์„œ ์ •๋ ฌ์„ ํ•ด์ค˜์•ผํ•˜๋ฏ€๋กœ ์ž๋™์ฐจ ๋ฒˆํ˜ธ๋„ ๊ฐ™์ด ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.

 

4. ์ •๋ ฌ

ans ๋ฐฐ์—ด์„ ์ž๋™์ฐจ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด์ค€๋‹ค

 

5. ๋‹ต ์ถœ๋ ฅ

์ •๋ ฌ๋œ ans๋ฐฐ์—ด์˜ ์š”๊ธˆ๋งŒ ์ง€๋‹ˆ๋Š” ๋ฐฐ์—ด๋กœ ๋‹ต์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋

 

function getTime(x) {
    x = x.split(":").map(i => parseInt(i));
    return x[0]*60 + x[1];
}

function solution(fees, records) {
    let [basicTime, basicFee, unitTime, unitFee] = fees;
    function getFee(time) { // ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง€๋ฉด ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
        if(time <= basicTime) {
            return basicFee
        } else {
            return basicFee + Math.ceil((time-basicTime)/unitTime)*unitFee
        }
    }
    
    records = records.map(i => i.split(" "));
    
    let lastIn = new Map(); // lastIn[i] = i์˜ ๋งˆ์ง€๋ง‰ ์ž…์ฐจ ์‹œ๊ฐ„ 
    let totalTime = new Map(); // totalTime[i] = i์˜ ๋ˆ„์  ์ฃผ์ฐจ ์‹œ๊ฐ„
    
    // ์ถœ์ฐจ๊ฐ€ ๋œ ์ฐจ๋Ÿ‰์˜ ๋ˆ„์  ์ฃผ์ฐจ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
    for(let record of records) {
        let [time, car, inout] = record;
        if(inout === "IN") {
            lastIn.set(car, time);
        } else {
            let timeDiff = getTime(time) - getTime(lastIn.get(car));
            lastIn.delete(car);
            if(totalTime.has(car)) {
                totalTime.set(car, totalTime.get(car)+timeDiff);
            } else {
                totalTime.set(car, timeDiff);
            }
        }
    }
    // ๋๊นŒ์ง€ ์ถœ์ฐจ๊ฐ€ ๋˜์ง€ ์•Š์€ ์ฐจ๋Ÿ‰ ์ฒ˜๋ฆฌ
    lastIn.forEach((time, car) => {
        let timeDiff = getTime("23:59") - getTime(time);
        if(totalTime.has(car)) {
            totalTime.set(car, totalTime.get(car)+timeDiff);
        } else {
            totalTime.set(car, timeDiff);
        } 
    })
    
    // ์š”๊ธˆ ๊ณ„์‚ฐํ•˜๊ธฐ
    let ans = [];
    totalTime.forEach((time, car) => {
        ans.push({car: car, fee: getFee(time)});
    })
    
    // ์ •๋ ฌ
    ans.sort((a,b) => a.car - b.car);
    
    return ans.map(x => x.fee);    
}
๋ฐ˜์‘ํ˜•