Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - κΈ°λŠ₯ 개발

Jieunny 2023. 3. 2. 16:51

πŸ“Œ  문제

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.

λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

μ œν•œ 사항

  • μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

πŸ’‘  아이디어

100%μ—μ„œ ν˜„μž¬ μ§„ν–‰ %λ₯Ό λΉΌκ³ , ν•˜λ£¨μ— ν•  수 μžˆλŠ” μž‘μ—…λŸ‰μœΌλ‘œ λ‚˜λˆ μ„œ 각 taskλ§ˆλ‹€ μ™„λ£Œλ˜κΈ°κΉŒμ§€ 남은 일수λ₯Ό κ΅¬ν•œλ‹€.

μ•ž μˆœμ„œ 일이 λλ‚˜μ§€ μ•ŠμœΌλ©΄ λ’· μˆœμ„œ 일이 μ™„λ£Œλ˜μ–΄λ„ 배포할 수 μ—†κΈ° λ•Œλ¬Έμ— 일단 맨 처음 task의 남은 날을 μŠ€νƒμ— λ„£λŠ”λ‹€.

그리고 2번째 μš”μ†ŒλΆ€ν„° λŒλ©΄μ„œ, 맨 처음 일보닀 적게 λ‚¨μ•˜μœΌλ©΄ μŠ€νƒμ— λ„£κ³ , λ§Œμ•½ 맨 처음 일보닀 많이 남은 일을 λ§Œλ‚˜λ©΄ 일단 μŠ€νƒμ„ λ‹€ λΉ„μš°κ³ , λΉ„μš΄ μŠ€νƒμ˜ 길이만큼 answer에 pushν•΄μ€€λ‹€. 그리고 λ‹€μ‹œ 맨 처음 일보닀 많이 남은 일을 μŠ€νƒμ— pushν•œλ‹€.

이 과정을 λ‹€ 거쳀을 λ•Œ μŠ€νƒμ΄ λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄, μŠ€νƒμ— 남은 일듀은 ν•œλ²ˆμ— 배포할 수 μžˆμœΌλ―€λ‘œ λ‹€ λΉΌμ£Όκ³  κ·Έ 길이만큼 answer에 pushν•œλ‹€.

 

✏️  풀이

function solution(progresses, speeds) {
  var answer = [];
  let leftDay = [];
  let stk = [];
  for(let i=0; i<progresses.length; i++){
    leftDay.push(Math.ceil((100-progresses[i]) / speeds[i]));
  }

  stk.push(leftDay[0]);
  for(let i=1; i<leftDay.length; i++){
    if(leftDay[i] <= stk[0] || stk.length === 0) {
      stk.push(leftDay[i]);
    }
    else if(leftDay[i] > stk[0]) {
      let complete = stk.length;
      stk.splice(0, complete);
      answer.push(complete)
      stk.push(leftDay[i]);
    }
  }
  if(stk.length > 0) answer.push(stk.length);

  return answer;
}