[JavaScript] ํ๋ก๊ทธ๋๋จธ์ค - ์ฃผ์ฐจ ์๊ธ ๊ณ์ฐ
[๋ฌธ์ ]
https://school.programmers.co.kr/learn/courses/30/lessons/92341
์ฃผ์ฐจ์ฅ์ ์๊ธํ์ ์ฐจ๋์ด ๋ค์ด์ค๊ณ (์ ์ฐจ) ๋๊ฐ(์ถ์ฐจ) ๊ธฐ๋ก์ด ์ฃผ์ด์ก์ ๋, ์ฐจ๋๋ณ๋ก ์ฃผ์ฐจ ์๊ธ์ ๊ณ์ฐํ๋ ค๊ณ ํฉ๋๋ค. ์๋๋ ํ๋์ ์์๋ฅผ ๋ํ๋ ๋๋ค.
- ์๊ธํ
๊ธฐ๋ณธ ์๊ฐ(๋ถ) | ๊ธฐ๋ณธ ์๊ธ(์) | ๋จ์ ์๊ฐ(๋ถ) | ๋จ์ ์๊ธ(์) |
180 | 5000 | 10 | 600 |
- ์ /์ถ์ฐจ ๊ธฐ๋ก
์๊ฐ(์:๋ถ) | ์ฐจ๋ ๋ฒํธ | ๋ด์ญ |
05:34 | 5961 | ์ ์ฐจ |
06:00 | 0000 | ์ ์ฐจ |
06:34 | 0000 | ์ถ์ฐจ |
07:59 | 5961 | ์ถ์ฐจ |
07:59 | 0148 | ์ ์ฐจ |
18:59 | 0000 | ์ ์ฐจ |
19:09 | 0148 | ์ถ์ฐจ |
22:59 | 5961 | ์ ์ฐจ |
23:00 | 5961 | ์ถ์ฐจ |
- ์๋์ฐจ๋ณ ์ฃผ์ฐจ ์๊ธ
์ฐจ๋ ๋ฒํธ | ๋์ ์ฃผ์ฐจ ์๊ฐ(๋ถ) | ์ฃผ์ฐจ ์๊ธ(์) |
0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
0148 | 670 | 5000 +⌈(670 - 180) / 10⌉x 600 = 34400 |
5961 | 145 + 1 = 146 | 5000 |
- ์ด๋ค ์ฐจ๋์ด ์
์ฐจ๋ ํ์ ์ถ์ฐจ๋ ๋ด์ญ์ด ์๋ค๋ฉด, 23:59์ ์ถ์ฐจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- 0000๋ฒ ์ฐจ๋์ 18:59์ ์ ์ฐจ๋ ์ดํ, ์ถ์ฐจ๋ ๋ด์ญ์ด ์์ต๋๋ค. ๋ฐ๋ผ์, 23:59์ ์ถ์ฐจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
- 00:00๋ถํฐ 23:59๊น์ง์ ์ /์ถ์ฐจ ๋ด์ญ์ ๋ฐํ์ผ๋ก ์ฐจ๋๋ณ ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ณ์ฐํ์ฌ ์๊ธ์ ์ผ๊ด๋ก ์ ์ฐํฉ๋๋ค.
- ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ดํ๋ผ๋ฉด, ๊ธฐ๋ณธ ์๊ธ์ ์ฒญ๊ตฌํฉ๋๋ค.
- ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ ์ด๊ณผํ๋ฉด, ๊ธฐ๋ณธ ์๊ธ์ ๋ํด์, ์ด๊ณผํ ์๊ฐ์ ๋ํด์ ๋จ์ ์๊ฐ ๋ง๋ค ๋จ์ ์๊ธ์ ์ฒญ๊ตฌํฉ๋๋ค.
- ์ด๊ณผํ ์๊ฐ์ด ๋จ์ ์๊ฐ์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ผ๋ฉด, ์ฌ๋ฆผํฉ๋๋ค.
- ⌈a⌉ : a๋ณด๋ค ์์ง ์์ ์ต์์ ์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ฌ๋ฆผ์ ์๋ฏธํฉ๋๋ค.
์ฃผ์ฐจ ์๊ธ์ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด fees, ์๋์ฐจ์ ์ /์ถ์ฐจ ๋ด์ญ์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐฐ์ด records๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ฐจ๋ ๋ฒํธ๊ฐ ์์ ์๋์ฐจ๋ถํฐ ์ฒญ๊ตฌํ ์ฃผ์ฐจ ์๊ธ์ ์ฐจ๋ก๋๋ก ์ ์ ๋ฐฐ์ด์ ๋ด์์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ- fees์ ๊ธธ์ด = 4
- fees[0] = ๊ธฐ๋ณธ ์๊ฐ(๋ถ)
- 1 ≤ fees[0] ≤ 1,439
- fees[1] = ๊ธฐ๋ณธ ์๊ธ(์)
- 0 ≤ fees[1] ≤ 100,000
- fees[2] = ๋จ์ ์๊ฐ(๋ถ)
- 1 ≤ fees[2] ≤ 1,439
- fees[3] = ๋จ์ ์๊ธ(์)
- 1 ≤ fees[3] ≤ 10,000
- 1 ≤ records์ ๊ธธ์ด ≤ 1,000
- records์ ๊ฐ ์์๋ "์๊ฐ ์ฐจ๋๋ฒํธ ๋ด์ญ" ํ์์ ๋ฌธ์์ด์ ๋๋ค.
- ์๊ฐ, ์ฐจ๋๋ฒํธ, ๋ด์ญ์ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์์ต๋๋ค.
- ์๊ฐ์ ์ฐจ๋์ด ์
์ฐจ๋๊ฑฐ๋ ์ถ์ฐจ๋ ์๊ฐ์ ๋ํ๋ด๋ฉฐ, HH:MM ํ์์ ๊ธธ์ด 5์ธ ๋ฌธ์์ด์
๋๋ค.
- HH:MM์ 00:00๋ถํฐ 23:59๊น์ง ์ฃผ์ด์ง๋๋ค.
- ์๋ชป๋ ์๊ฐ("25:22", "09:65" ๋ฑ)์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ฐจ๋๋ฒํธ๋ ์๋์ฐจ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ, `0'~'9'๋ก ๊ตฌ์ฑ๋ ๊ธธ์ด 4์ธ ๋ฌธ์์ด์ ๋๋ค.
- ๋ด์ญ์ ๊ธธ์ด 2 ๋๋ 3์ธ ๋ฌธ์์ด๋ก, IN ๋๋ OUT์ ๋๋ค. IN์ ์ ์ฐจ๋ฅผ, OUT์ ์ถ์ฐจ๋ฅผ ์๋ฏธํฉ๋๋ค.
- records์ ์์๋ค์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์ฃผ์ด์ง๋๋ค.
- records๋ ํ๋ฃจ ๋์์ ์ /์ถ์ฐจ๋ ๊ธฐ๋ก๋ง ๋ด๊ณ ์์ผ๋ฉฐ, ์ ์ฐจ๋ ์ฐจ๋์ด ๋ค์๋ ์ถ์ฐจ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ๊ฐ์ ์๊ฐ์, ๊ฐ์ ์ฐจ๋๋ฒํธ์ ๋ด์ญ์ด 2๋ฒ ์ด์ ๋ํ๋ด์ง ์์ต๋๋ค.
- ๋ง์ง๋ง ์๊ฐ(23:59)์ ์ ์ฐจ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์๋์ ์๋ฅผ ํฌํจํ์ฌ, ์๋ชป๋ ์
๋ ฅ์ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- ์ฃผ์ฐจ์ฅ์ ์๋ ์ฐจ๋์ด ์ถ์ฐจ๋๋ ๊ฒฝ์ฐ
- ์ฃผ์ฐจ์ฅ์ ์ด๋ฏธ ์๋ ์ฐจ๋(์ฐจ๋๋ฒํธ๊ฐ ๊ฐ์ ์ฐจ๋)์ด ๋ค์ ์ ์ฐจ๋๋ ๊ฒฝ์ฐ
[ํ์ด]
1. ์ฐจ๋ ๋ฒํธ๊ฐ ์์ ์์๋๋ก ์ด ์๊ฐ์ ๋ํ ์ฃผ์ฐจ ์๊ธ์ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ park ๋ฐฐ์ด์ records ๋ด์ฉ์ ์๋์ ๊ฐ์ด ์ ๋ ฌํ์ฌ ์ ์ฅํ์ต๋๋ค.
- ์ฐจ๋ ๋ฒํธ๊ฐ ์์ ์์๋๋ก ์ ๋ ฌ
- ๋ง์ฝ ์ฐจ๋ ๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด ์๊ฐ์ด ๋น ๋ฅธ ์์ผ๋ก ์ ๋ ฌ
๋ฐ๋ผ์ ์์ 1๋ฒ์ ์์ ๊ฐ์ด ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
2. ๋๊ฐ ๊ธฐ๋ก์ด ์์ด๋ ๋ค์ด์จ ๊ธฐ๋ก์ด ์๋ ์ฐจ๋์ ์๊ธฐ ๋๋ฌธ์, park๋ฐฐ์ด์ ๋ง์ง๋ง index๋ถํฐ 0๋ฒ์งธ๊น์ง ํ์ํ์ฌ ๊ฐ ์ฐจ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๋ํ ์๊ธ์ ๊ณ์ฐํ์์ต๋๋ค.
ํ์ฉ๋ ๋ฉ์๋
- getNumberTime(๋ฌธ์์ด ์๊ฐ) : ์ซ์๋ก ๋ณํ๋ ์๊ฐ ๋ฐํ
- getParkTime(์์ ์๊ฐ, ๋๋๋ ์๊ฐ) : IN ~ OUT ์ฌ์ด์ ์๊ฐ ์ฐจ๋ฅผ ๋ฐํ
- getTotalFee(์ด ์๊ฐ) : fees ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด ์ฃผ์ฐจ ์๊ธ์ ๋ฐํ
ํ์ด ๊ณผ์
- index์ ๋ด์ญ์ ์ด์ฉํด OUT - IN ํ ์ธํธ๋ฅผ ๋ง๋ค์ด ์๊ฐ์ ๊ตฌํจ
- index์ ๋ด์ญ์ด IN์ด๋ผ๋ฉด, ๋๊ฐ ๊ธฐ๋ก์ด ์๋ ์ฐจ๋์ด๋ฏ๋ก getParkTime(IN ์๊ฐ, 23:59)์ ํตํด time์ ์๊ฐ์ ๋ํจ
- index์ ๋ด์ญ์ด OUT์ด๋ผ๋ฉด index-1๋ฒ์งธ IN ๋ฐ์ดํฐ๋ฅผ ํ์์ผ๋ก (IN ์๊ฐ, OUT์๊ฐ)์ผ๋ก time์ ์๊ฐ์ ๋ํ๊ณ
๋ค์ index๊ฐ index-2๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก i--์ฐ์ฐ
- ๋ง์ฝ index๊ฐ 0์ด๊ฑฐ๋ index-1์ ํ์ฌ์ ์ฐจ๋ ๋ฒํธ๊ฐ ๋ค๋ฅด๋ค๋ฉด, ํด๋น ์ฐจ๋ ๋ฒํธ์ ๋ํ ์ฐ์ฐ์ ๋ง์น๊ณ 1๋ฒ ๊ณผ์ ์์ getTotalFee(time)์ ํตํด ์๊ธ์ ๋ํด answer์ unshift์ ํตํด ๋งจ์์ ์๊ธ ์ถ๊ฐ. ๊ทธ ์ธ์ ๊ฒฝ์ฐ์ 1๋ฒ์ ๋ฐ๋ณต
- answer์ unshiftํ๋ ์ด์ ๋, ์ฐจ๋ ๋ฒํธ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ park ๋ฐฐ์ด์ ๋ฐ๋๋ก ํ์ํ๊ณ ์๊ธฐ ๋๋ฌธ!
[์ฝ๋]
function solution(fees, records) {
var answer = [];
const getNumberTime = (time) => {
const arr = time.split(":");
return Number.parseInt(arr[0]) * 60 + Number.parseInt(arr[1]);
}
const getParkTime = (start, end) => {
return getNumberTime(end) - getNumberTime(start);
}
const getTotalFee = (time) => {
// ๊ธฐ๋ณธ ์๊ฐ
let cost = fees[1];
time -= fees[0];
// ์ถ๊ฐ ๋จ์ ์๊ฐ
if(time > 0) {
cost += Math.ceil(time/fees[2]) * fees[3];
}
return cost;
}
const park = records.map((item) => item.split(" ")).sort((a, b) => a[1] === b[1] ? a[0] - b[0] : a[1] - b[1]);
let time = 0;
for(let i=park.length-1; i>=0;i--) {
if(park[i][2] === 'IN') {
// ๋๊ฐ ๊ธฐ๋ก์ด ์๋ ์ฐจ๋
time += getParkTime(park[i][0], "23:59");
} else {
// ๋๊ฐ ๊ธฐ๋ก์ด ์๋ ์ฐจ๋
time += getParkTime(park[i-1][0], park[i][0]);
i--;
}
// ์ฐจ๋ ์ข
๋ฅ๊ฐ ๋ฐ๋๋ฉด answer ๋งจ ์์ ์ฃผ์ฐจ ์๊ธ ์ถ๊ฐ
if(i === 0 || (park[i][1] !== park[i-1][1])) {
answer.unshift(getTotalFee(time));
time = 0;
}
}
return answer;
}