Algorithm/Programmers

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

๊ฐœ๋ฐœ๊ฐœ๊ตด๐Ÿธ 2022. 8. 18. 17:02

[๋ฌธ์ œ]

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

 

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

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

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…

์ฃผ์ฐจ์žฅ์˜ ์š”๊ธˆํ‘œ์™€ ์ฐจ๋Ÿ‰์ด ๋“ค์–ด์˜ค๊ณ (์ž…์ฐจ) ๋‚˜๊ฐ„(์ถœ์ฐจ) ๊ธฐ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฐจ๋Ÿ‰๋ณ„๋กœ ์ฃผ์ฐจ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • ์š”๊ธˆํ‘œ
๊ธฐ๋ณธ ์‹œ๊ฐ„(๋ถ„) ๊ธฐ๋ณธ ์š”๊ธˆ(์›) ๋‹จ์œ„ ์‹œ๊ฐ„(๋ถ„) ๋‹จ์œ„ ์š”๊ธˆ(์›)
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 ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์ฃผ์ฐจ ์š”๊ธˆ์„ ๋ฐ˜ํ™˜

 

ํ’€์ด ๊ณผ์ •

  1. index์˜ ๋‚ด์—ญ์„ ์ด์šฉํ•ด OUT - IN ํ•œ ์„ธํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‹œ๊ฐ„์„ ๊ตฌํ•จ
    1. index์˜ ๋‚ด์—ญ์ด IN์ด๋ผ๋ฉด, ๋‚˜๊ฐ„ ๊ธฐ๋ก์ด ์—†๋Š” ์ฐจ๋Ÿ‰์ด๋ฏ€๋กœ getParkTime(IN ์‹œ๊ฐ„, 23:59)์„ ํ†ตํ•ด time์— ์‹œ๊ฐ„์„ ๋”ํ•จ
    2. index์˜ ๋‚ด์—ญ์ด OUT์ด๋ผ๋ฉด index-1๋ฒˆ์งธ IN ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ์Œ์œผ๋กœ (IN ์‹œ๊ฐ„, OUT์‹œ๊ฐ„)์œผ๋กœ  time์— ์‹œ๊ฐ„์„ ๋”ํ•˜๊ณ 
      ๋‹ค์Œ index๊ฐ€ index-2๋ฅผ ๋ฐ”๋ผ๋ณด๋„๋ก i--์—ฐ์‚ฐ
  2. ๋งŒ์•ฝ index๊ฐ€ 0์ด๊ฑฐ๋‚˜ index-1์™€ ํ˜„์žฌ์˜ ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•ด๋‹น ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ๋งˆ์น˜๊ณ  1๋ฒˆ ๊ณผ์ •์—์„œ getTotalFee(time)์„ ํ†ตํ•ด ์š”๊ธˆ์„ ๋”ํ•ด answer์— unshift์„ ํ†ตํ•ด ๋งจ์•ž์— ์š”๊ธˆ ์ถ”๊ฐ€. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—” 1๋ฒˆ์„ ๋ฐ˜๋ณต
    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;
}