Algorithm

[Algorithm] ๊ณผ์ œ ์ง„ํ–‰ํ•˜๊ธฐ

ghkdu2 2023. 4. 2. 00:21

๐Ÿ“‹ ๋ฌธ์ œ

๊ณผ์ œ๋ฅผ ๋ฐ›์€ ๋ฃจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ๊ณผ์ œ๋ฅผ ํ•˜๋ ค๊ณ  ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.

  • ๊ณผ์ œ๋Š” ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ํ•œ ์‹œ๊ฐ์ด ๋˜๋ฉด ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•  ์‹œ๊ฐ์ด ๋˜์—ˆ์„ ๋•Œ, ๊ธฐ์กด์— ์ง„ํ–‰ ์ค‘์ด๋˜ ๊ณผ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ง„ํ–‰ ์ค‘์ด๋˜ ๊ณผ์ œ๋ฅผ ๋ฉˆ์ถ”๊ณ  ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง„ํ–‰์ค‘์ด๋˜ ๊ณผ์ œ๋ฅผ ๋๋ƒˆ์„ ๋•Œ, ์ž ์‹œ ๋ฉˆ์ถ˜ ๊ณผ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๋ฅผ ์ด์–ด์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ, ๊ณผ์ œ๋ฅผ ๋๋‚ธ ์‹œ๊ฐ์— ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ๋˜๋Š” ๊ณผ์ œ์™€ ์ž ์‹œ ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๊ฐ€ ๋ชจ๋‘ ์žˆ๋‹ค๋ฉด, ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉˆ์ถฐ๋‘” ๊ณผ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋ฉˆ์ถ˜ ๊ณผ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ ๊ณ„ํš์„ ๋‹ด์€ ์ด์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด plans๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ณผ์ œ๋ฅผ ๋๋‚ธ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฆ„์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • 3 ≤ plans์˜ ๊ธธ์ด ≤ 1,000
    • plans์˜ ์›์†Œ๋Š” [name, start, playtime]์˜ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
      • name : ๊ณผ์ œ์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
        • 2 ≤ name์˜ ๊ธธ์ด ≤ 10
        • name์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
        • name์ด ์ค‘๋ณต๋˜๋Š” ์›์†Œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
      • start : ๊ณผ์ œ์˜ ์‹œ์ž‘ ์‹œ๊ฐ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
        • "hh:mm"์˜ ํ˜•ํƒœ๋กœ "00:00" ~ "23:59" ์‚ฌ์ด์˜ ์‹œ๊ฐ„๊ฐ’๋งŒ ๋“ค์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
        • ๋ชจ๋“  ๊ณผ์ œ์˜ ์‹œ์ž‘ ์‹œ๊ฐ์€ ๋‹ฌ๋ผ์„œ ๊ฒน์น  ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.
        • ๊ณผ์ œ๋Š” "00:00" ... "23:59" ์ˆœ์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‹œ์™€ ๋ถ„์˜ ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ๋” ๋นจ๋ฆฌ ์‹œ์ž‘ํ•œ ๊ณผ์ œ์ž…๋‹ˆ๋‹ค.
      • playtime : ๊ณผ์ œ๋ฅผ ๋งˆ์น˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋‹จ์œ„๋Š” ๋ถ„์ž…๋‹ˆ๋‹ค.
        • 1 ≤ playtime ≤ 100
        • playtime์€ 0์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ๋ฐฐ์—ด์€ ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง„ํ–‰์ค‘์ด๋˜ ๊ณผ์ œ๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ๊ณผ ์ƒˆ๋กœ์šด ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•ด์•ผํ•˜๋Š” ์‹œ๊ฐ์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ง„ํ–‰์ค‘์ด๋˜ ๊ณผ์ œ๋Š” ๋๋‚œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

[["korean", "11:40", "30"], ["english", "12:10", "20"], ["math", "12:30", "40"]] ["korean", "english", "math"]
[["science", "12:40", "50"], ["music", "12:20", "40"], ["history", "14:00", "30"], ["computer", "12:30", "100"]] ["science", "history", "computer", "music"]
[["aaa", "12:00", "20"], ["bbb", "12:10", "30"], ["ccc", "12:40", "10"]] ["bbb", "ccc", "aaa"]


โœ๏ธ ํ’€์ด

์Šคํ…์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ ์ „์— ์‹œ๊ฐ„์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋‹ค. ๋ชจ๋“  ์‹œ๊ฐ„์€ ๋ถ„ ๋‹จ์œ„๋กœ ๋ฐ”๊พธ๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ๋‹ค.

 

์ด์ „์˜ ๊ณผ์ œ๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ„๊ณผ ๋‹ค์Œ ๊ณผ์ œ์˜ ์‹œ์ž‘์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๋ฉฐ ๋ฐ˜๋ณต๋ฌธ์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ด์ „ ์‹œ๊ฐ„์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„์€ ๊ณผ์ œ์˜ ์‹œ์ž‘์‹œ๊ฐ„ + ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด๋‹ค. ๋งŒ์•ฝ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋‹ค์Œ ๊ณผ์ œ์˜ ์‹œ์ž‘์‹œ๊ฐ„๋ณด๋‹ค ๋Šฆ๋‹ค๋ฉด ๊ณผ์ œ๋ฅผ ๋‹ค ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์Šคํ…์— ๋„ฃ์–ด์ค€๋‹ค. ์ด๋•Œ ์Šคํ…์—๋Š” ๊ณผ์ œ์ด๋ฆ„, ๋‚จ์€ ์‹œ๊ฐ„์ด ํ•จ๊ป˜ ๋“ค์–ด๊ฐ„๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ด์ „ ๊ณผ์ œ์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋‹ค์Œ ๊ณผ์ œ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋ฉด ๋‹ค์Œ ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ณผ์ œ๋ฅผ ๋๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— answer์— ๊ณผ์ œ๋ช…์„ ๋„ฃ์–ด์ค€๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‚จ๋Š” ์—ฌ์œ ์‹œ๊ฐ„๋™์•ˆ ์Šคํ…์— ์žˆ๋Š” ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋งŒ์•ฝ ๋‚จ์€ ์—ฌ์œ ์‹œ๊ฐ„์ด ์Šคํ…์˜ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ์š”์†Œ์˜ ๋‚จ์€ ์‹œ๊ฐ„๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์Šคํ…์—์„œ ์ œ๊ฑฐํ•ด์ฃผ๊ณ  answer์— ๊ณผ์ œ๋ช…์„ ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์„ ์Šคํ…์— ๊ณผ์ œ๊ฐ€ ์กด์žฌํ•  ๋•Œ, ์—ฌ์œ ์‹œ๊ฐ„์ด ํด ๋•Œ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•œ๋‹ค.(while๋ฌธ ์‚ฌ์šฉ) ๋งŒ์•ฝ ์—ฌ์œ ์‹œ๊ฐ„๋™์•ˆ ์Šคํ… ๋‚ด ๊ณผ์ œ๋ฅผ ๋๋‚ผ ์ˆ˜ ์—†๋‹ค๋ฉด ์—ฌ์œ ์‹œ๊ฐ„ ๋งŒํผ ๋‚จ์€ ์‹œ๊ฐ„์—์„œ ๋นผ์ค€๋‹ค. 

 

plans ๋ฐฐ์—ด ๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋˜๊ฒŒ ๋˜๋ฉด ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ๋ฌด์กฐ๊ฑด ๋๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— answer์— ๋„ฃ์–ด์ฃผ๊ณ  ์Šคํ…์— ๋‚จ์€ ๊ณผ์ œ๋“ค์„ popํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ answer์— ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.

โŒจ๏ธ ์ฝ”๋“œ

function solution(plans) {
  var answer = [];
  const queue = [];

  plans = plans
    .map(plan => {
      const [assignment, start, time] = plan;
      const [h, m] = start.split(':').map(Number);
      return [assignment, h * 60 + m, +time];
    })
    .sort((a, b) => a[1] - b[1]);

  for (let i = 1; i < plans.length; i++) {
    const prevEndTime = plans[i - 1][1] + plans[i - 1][2];
    if (prevEndTime > plans[i][1]) queue.push([plans[i - 1][0], prevEndTime - plans[i][1]]);
    else {
      answer.push(plans[i - 1][0]);

      let remainingTime = plans[i][1] - prevEndTime;

      while (queue.length && queue[queue.length - 1][1] <= remainingTime) {
        const [assignment, needTime] = queue.pop();
        remainingTime -= needTime;
        answer.push(assignment);
      }

      if (remainingTime && queue.length) {
        queue[queue.length - 1][1] -= remainingTime;
      }
    }
  }

  answer.push(plans[plans.length - 1][0]);

  while (queue.length) {
    const [assignment, needTime] = queue.pop();
    answer.push(assignment);
  }

  return answer;
}