๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๊ธˆ๊ณผ ์€ ์šด๋ฐ˜ํ•˜๊ธฐ

๐Ÿ“‹ ๋ฌธ์ œ

์–ด๋А ์™•๊ตญ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ๋„์‹œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™•๊ตญ์˜ ์™•์€ ์ƒˆ ๋„์‹œ๋ฅผ ์ง“๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋„์‹œ๋ฅผ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„์‹œ๋ฅผ ์ง“๋Š” ์žฅ์†Œ์— ๊ธˆ a kg๊ณผ ์€ b kg์ด ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๋„์‹œ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š”๋ฐ, i๋ฒˆ ๋„์‹œ์—๋Š” ๊ธˆ g[i] kg, ์€ s[i] kg, ๊ทธ๋ฆฌ๊ณ  ํŠธ๋Ÿญ ํ•œ ๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. i๋ฒˆ ๋„์‹œ์˜ ํŠธ๋Ÿญ์€ ์˜ค์ง ์ƒˆ ๋„์‹œ๋ฅผ ์ง“๋Š” ๊ฑด์„ค ์žฅ์†Œ์™€ i๋ฒˆ ๋„์‹œ๋งŒ์„ ์™•๋ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŽธ๋„๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ t[i] ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ , ์ตœ๋Œ€ w[i] kg ๊ด‘๋ฌผ์„ ์šด๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ด‘๋ฌผ์€ ๊ธˆ๊ณผ ์€์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ธˆ๊ณผ ์€์„ ๋™์‹œ์— ์šด๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋ชจ๋“  ํŠธ๋Ÿญ์€ ๊ฐ™์€ ๋„๋กœ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์™•๋ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฐ๋ฃŒ๋Š” ๋ฌดํ•œ๋Œ€๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ •์ˆ˜ a, b์™€ ์ •์ˆ˜ ๋ฐฐ์—ด g, s, w, t๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ๋„์‹œ์˜ ํŠธ๋Ÿญ์„ ์ตœ์ ์œผ๋กœ ์šดํ–‰ํ–ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ๋„์‹œ๋ฅผ ๊ฑด์„คํ•˜๊ธฐ ์œ„ํ•ด ๊ธˆ a kg๊ณผ ์€ b kg์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๊ตฌํ•ด return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • 0 ≤ a, b ≤ 109
  • 1 ≤ g์˜ ๊ธธ์ด = s์˜ ๊ธธ์ด = w์˜ ๊ธธ์ด = t์˜ ๊ธธ์ด = ๋„์‹œ ๊ฐœ์ˆ˜ ≤ 105
    • 0 ≤ g[i], s[i] ≤ 109
    • 1 ≤ w[i] ≤ 102
    • 1 ≤ t[i] ≤ 105
    • a ≤ g์˜ ๋ชจ๋“  ์ˆ˜์˜ ํ•ฉ
    • b ≤ s์˜ ๋ชจ๋“  ์ˆ˜์˜ ํ•ฉ

 

์ž…์ถœ๋ ฅ ์˜ˆ

10 10 [100] [100] [7] [10] 50
90 500 [70,70,0] [0,0,500]  [100,100,2]  [4,8,1] 499

 

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

์ด์ „์— ํ’€์—ˆ๋˜ ์„ ์ž… ์„ ์ถœ ์Šค์ผ€์ค„๋ง๊ณผ ๋น„์Šทํ•œ ๋А๋‚Œ์„ ๋ฐ›์•˜๊ธฐ์— ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.  mid๋Š” ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

 

left, right๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. right๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์ด ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 10^5(์‹œ๊ฐ„) * 10^9(๋ฌด๊ฒŒ) * ์™•๋ณต(2)์„ ๊ณ ๋ คํ•ด์„œ ๋„‰๋„‰ํ•˜๊ฒŒ 10^15๋กœ ์„ ์–ธํ•ด์คฌ๋‹ค. ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ธˆ๊ณผ ์€์˜ ์–‘์„ ํ™•์ธํ•˜๋ฉฐ ์ง„ํ–‰ํ–ˆ๋‹ค. for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋จผ์ € ํŽธ๋„๋กœ ๊ด‘์„์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ–ˆ๋‹ค. ์™•๋ณต์ด๋ผ๋ฉด ์‹œ๊ฐ„์— 2๋ฅผ ๊ณฑํ•œ๋งŒํผ ์‹œ๊ฐ„์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ธ mid๋ฅผ ์‹œ๊ฐ„ * 2๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ํฐ์ง€๋ฅผ ํ™•์ธํ–ˆ๋‹ค. ๊ทธ ๋‹ค์Œ ํ˜„์žฌ ๋„์‹œ์—์„œ ์ด๋™๊ฐ€๋Šฅํ•œ ๊ด‘์„์˜ ์–‘(availableWeight)์„ ๊ตฌํ–ˆ๋‹ค. ์™•๋ณต์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜(Math.floor(mid / (t[i] * 2)))์— ํ•œ๋ฒˆ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘(w[i])์„ ๊ณฑํ•ด์ฃผ๊ณ  ์•ž์„œ ํ™•์ธํ–ˆ๋˜ ๋งˆ์ง€๋ง‰์— ํŽธ๋„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ํ˜„์žฌ ๋„์‹œ์˜ ๊ธˆ, ์€์˜ ์–‘๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธˆ, ์€์˜ ์–‘์„ ํ™•์ธํ–ˆ๋‹ค. ๋งŒ์•ฝ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ด‘์„์˜ ์–‘๋ณด๋‹ค ๋„์‹œ์—์„œ ๋ณด์œ ํ•œ ๊ธˆ ๋˜๋Š” ์€์ด ์ž‘์€ ๊ฒฝ์šฐ ๋ณด์œ ํ•œ ๊ธˆ, ์€ ์–‘์„ ๋”ํ•ด์ฃผ๊ณ  ์•„๋‹Œ ๊ฒฝ์šฐ ์•ž์„œ ๊ตฌํ•œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘์„ ๋”ํ–ˆ๋‹ค. 

 

๊ธˆ๊ณผ ์€์˜ ์–‘์ด ๋ชจ๋‘ ์š”๊ตฌ๋˜๋Š” ์–‘(a, b)๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ right๋ฅผ mid๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  answer๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ตœ์‹ ํ™”ํ–ˆ๋‹ค. ๋ฐ˜๋Œ€์ธ ๊ฒฝ์šฐ left๋ฅผ mid๋กœ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ ํ•˜๋‚˜์˜ ๋„์‹œ์—์„œ ๊ธˆ๊ณผ ์€์„ ๋ชจ๋‘ ๋ณด์œ ํ•œ ๊ฒฝ์šฐ์˜€๋‹ค. ์ง€๊ธˆ๊นŒ์ง€์˜ ๋‚ด ํ’€์ด์— ๋”ฐ๋ฅด๋ฉด ๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธˆ๊ณผ ์€์ด 100์”ฉ ์žˆ์„ ๋•Œ ์œ„ ์„ค๋ช…๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๋Œ๋ฉด 30์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘์ด ๊ธˆ๊ณผ ์€์— ๋ชจ๋‘ ์ค‘์ฒฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜๋‚˜๋ฟ์ธ ๋„์‹œ์—์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘์€ 14์ง€๋งŒ ๊ธˆ๊ณผ ์€์˜ ์–‘์„ ๊ฐ๊ฐ ๊ณ„์‚ฐํ•  ๋•Œ 14๋ผ๋Š” ๊ฐ’์„ ๋‘๊ณ  ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์œผ๋‚˜ ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ total์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋” ๋‘๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธˆ๊ณผ ์€์˜ ์–‘์„ ๊ณ„์‚ฐํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณด์œ ํ•œ ๊ธˆ + ๋ณด์œ ํ•œ ์€๊ณผ ๊ตฌํ•œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘์„ ๋น„๊ตํ•˜์—ฌ ๋”ํ•ด๊ฐ€์ค€๋‹ค. ๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ฅผ ๊ธฐ์ค€์ด๋กœ 14๋ผ๋Š” ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ๋‚˜์™”์„ ๋•Œ ๊ธˆ๊ณผ ์€์˜ ์ด๋Ÿ‰์€ 20์ด๋ฏ€๋กœ total์—๋Š” 14๊ฐ€ ํ• ๋‹น๋˜๊ณ  ํ•„์š”ํ•œ ๊ธˆ, ์€์„ ๋น„๊ตํ•˜๋Š” ์•„๋ž˜ ์กฐ๊ฑด๋ฌธ์—์„œ total๊ฐ’๋„ ํ™•์ธํ•ด์ค€๋‹ค.(total >= a + b) ๋‘ ๊ด‘๋ฌผ ๋ชจ๋‘ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ ๋™์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ด‘์„์„ ๋ณด๋‚ด๋ฉด ๋˜๋Š”๋ฐ ์ด๋•Œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์–‘์ด ํ•„์š”ํ•œ ์–‘์„ ์ดˆ๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ์˜€๋‹ค...!

 

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

function solution(a, b, g, s, w, t) {
  var answer = Infinity;

  const n = g.length;

  let left = 1;
  let right = 10 ** 15;

  while (left < right) {
    const mid = Math.floor((left + right) / 2);

    let gold = 0;
    let silver = 0;
    let total = 0;
    for (let i = 0; i < n; i++) {
      const canOneWay = mid % (t[i] * 2) >= t[i];
      let availableWeight = Math.floor(mid / (t[i] * 2)) * w[i];
      if (canOneWay) availableWeight += w[i];

      gold += availableWeight > g[i] ? g[i] : availableWeight;
      silver += availableWeight > s[i] ? s[i] : availableWeight;
      total += availableWeight > s[i] + g[i] ? s[i] + g[i] : availableWeight;
    }

    if (gold >= a && silver >= b && total >= a + b) {
      right = mid;
      answer = Math.min(answer, mid);
    } else {
      left = mid + 1;
    }
  }

  return answer;
}