Home πŸ„πŸ»β€β™€οΈ [μžλ°”μŠ€ν¬λ¦½νŠΈ] λ””μŠ€ν¬ 컨트둀러
Post
Cancel

πŸ„πŸ»β€β™€οΈ [μžλ°”μŠ€ν¬λ¦½νŠΈ] λ””μŠ€ν¬ 컨트둀러

πŸ“„ 문제

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λ””μŠ€ν¬ 컨트둀러

κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” 것은

νŒŒλΌλ―Έν„°λ‘œ 전달받은 μž‘μ—… λͺ©λ‘(jobs)을 μ–΄λ–€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Ό κ°€μž₯ μ΅œμ†Œμ˜ ν‰κ· μ‹œκ°„μ„ 찾을 수 μžˆλŠ”μ§€λ₯Ό νŒŒμ•…ν•΄μ•Ό ν•œλ‹€.

μˆ˜ν–‰μ€‘μΈ μž‘μ—…μ΄ μ—†λ‹€λ©΄ λ¨Όμ € λ“€μ–΄μ˜¨ μž‘μ—…μ„ μš°μ„  μ²˜λ¦¬ν•΄μ•Ό ν•˜κ³ , μˆ˜ν–‰μ€‘μΈ μž‘μ—…μ΄ 있으면 κ·Έ μž‘μ—…μ΄ λλ‚˜λŠ” μ‹œμ κΉŒμ§€ λ“€μ–΄μ˜€λŠ” μš”μ²­λ“€μ„ μ²˜λ¦¬μ‹œκ°„μ˜ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄μ„œ λŒ€κΈ°μ—΄μ— μ‚½μž… ν›„ μˆœμ„œλŒ€λ‘œ μˆ˜ν–‰ν•œλ‹€.

jobs의 μš”μ†ŒλŠ” [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„] ν˜•νƒœμ΄λ―€λ‘œ μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ μœΌλ‘œ μ–Έμ œ λŒ€κΈ°μ—΄μ— 넣을 것인지, μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„μœΌλ‘œ λŒ€κΈ°μ—΄ λ‚΄μ—μ„œμ˜ μˆ˜ν–‰ μˆœμ„œλ₯Ό κ³„μ‚°ν•œλ‹€.

μ€‘μš”ν•œ 점은 μž‘μ—… λͺ©λ‘ jobsλŠ” μš”μ²­ μ‹œκ°„μ΄ μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. (예) [[7, 8], [3, 5], [9, 6]]) μˆ˜ν–‰μ€‘μΈ μž‘μ—…μ΄ μ—†λ‹€λ©΄ λ¨Όμ € λ“€μ–΄μ˜¨ μž‘μ—…μ„ μš°μ„  μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ μš”μ²­ μ‹œκ°„μ˜ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λ„λ‘ ν•œλ‹€.

1️⃣ νŒŒλΌλ―Έν„°λ‘œ 받은 배열을 μˆœνšŒν•˜λ©° 쑰건에 따라 μƒˆλ‘œμš΄ 배열에 μ‚½μž…ν•˜κ³  μ •λ ¬ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
const solution = (jobs) => {
  // μž‘μ—…μ˜ λŒ€κΈ°μ—΄ 역할을 ν•  λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.
  const priorityQueue = [];

  // time : μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©° ν˜„μž¬ μ‹œμ μ΄ μ–Έμ œμΈμ§€ μ €μž₯ν•œλ‹€. 즉, 처음 0msμ—μ„œ μ‹œμž‘ν•˜μ—¬ 3ms만큼 κ±Έλ¦¬λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ time을 3으둜 κ°±μ‹ ν•œλ‹€.
  // index : jobsλ₯Ό λ°˜λ³΅ν•˜κΈ° μœ„ν•œ μΈλ±μŠ€λ‹€.
  // result : 각 μž‘μ—…μ˜ 총 μˆ˜ν–‰ μ‹œκ°„μ„ λˆ„μ ν•œλ‹€. 총 μ†Œμš” μ‹œκ°„μ€ μž‘μ—… 처리 μ‹œκ°„κ³Ό λŒ€κΈ° μ‹œκ°„μ„ λ”ν•œ 값이닀. μΆ”ν›„ 평균 μ‹œκ°„μ„ κ³„μ‚°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  let time = 0,
    index = 0,
    result = 0;
};

2️⃣ λ¨Όμ € λ“€μ–΄μ˜¨ μž‘μ—…μ„ μš°μ„  μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μš”μ²­ μ‹œκ°„μ˜ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•œλ‹€.

μˆ˜ν–‰μ€‘μΈ μž‘μ—…μ΄ μ—†λ‹€λ©΄ λ¨Όμ € λ“€μ–΄μ˜¨ μž‘μ—…μ„ μš°μ„  μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ μš”μ²­ μ‹œκ°„μ΄ λΉ λ₯Έ 순으둜 정렬이 ν•„μš”ν•˜λ‹€.

μš”μ†Œ ν˜•νƒœλŠ” [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„]μ΄λ―€λ‘œ 0번째 μš”μ†Œλ‘œ λΉ„κ΅ν•œλ‹€.

[[7, 8], [3, 5], [9, 6]]λΌλŠ” μž‘μ—… λͺ©λ‘μ΄ μ „λ‹¬λ˜λ©΄ [[3, 5], [7, 8], [9, 6]]둜 μ •λ ¬λœλ‹€. 이 μž‘μ—… λͺ©λ‘μ€ 3ms에 처음 μž‘μ—… μš”μ²­μ„ ν•œ 것이닀.

1
jobs.sort((a, b) => a[0] - b[0]);

3️⃣ ν˜„μž¬ μ‹œμ  이전에 λ“€μ–΄μ˜¨ μž‘μ—…μ„ λŒ€κΈ°μ—΄μ— μ‚½μž…ν•˜κ³ , λŒ€κΈ°μ—΄ λ‚΄μ—μ„œ κ°€μž₯ μ†Œμš” μ‹œκ°„μ΄ 짧은 μž‘μ—…μ„ μ•žμœΌλ‘œ 보낸닀.

1
2
3
4
5
6
7
8
9
// ν˜„μž¬ μ‹œμ κ³Ό κ°€μž₯ λΉ λ₯Έ μš”μ²­ μ‹œκ°„μ΄ κ°™κ±°λ‚˜ 크면 ν˜„μž¬ μ‹œμ  이전에 λ“€μ–΄μ˜¨ μž‘μ—…μ„ λŒ€κΈ°μ—΄μ— μ‚½μž…ν•œλ‹€.
if (index < jobs.length && time >= jobs[index][0]) {
    priorityQueue.push(jobs[index++]);

    // 짧은 μ†Œμš”μ‹œκ°„μ΄ λ¨Όμ € μ²˜λ¦¬λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ μ†Œμš”μ‹œκ°„μ˜ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
    priorityQueue.sort((a, b) => a[1] - b[1]);

    continue;
}

4️⃣ λŒ€κΈ°μ—΄μ— μžˆλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©° μ‹œμ κ³Ό 총 μž‘μ—… μ‹œκ°„μ„ κ°±μ‹ ν•œλ‹€.

ν˜„μž¬ μ‹œμ μ—μ„œ λŒ€κΈ°μ—΄λ‘œ μΆ”κ°€ν•  μž‘μ—…μ΄ μ—†λ‹€λ©΄ κ°€μž₯ 짧은 μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ‹œμ μ΄λ―€λ‘œ λŒ€κΈ°μ—΄μ˜ 첫 번째 μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. μž‘μ—…μ΄ μˆ˜ν–‰λœ κ²ƒμ΄λ―€λ‘œ μž‘μ—…μ΄ μ™„λ£Œλœ ν›„μ˜ μ‹œμ κ³Ό ν•΄λ‹Ή μž‘μ—…μ— μ†Œμš”λœ μ‹œκ°„μ„ κ³„μ‚°ν•˜μ—¬ 각각 λ³€μˆ˜μ— κ°€μ‚°ν•œλ‹€.

1
2
3
4
5
if (priorityQueue.length > 0) {
  const [requestTime, workingTime] = priorityQueue.shift();
  time += workingTime;
  result += time - requestTime;
}

5️⃣ ν˜„μž¬ μ‹œμ  κΈ°μ€€ 이전에 λ“€μ–΄μ˜¨ μž‘μ—…μ΄ μ—†κ³ , λŒ€κΈ°μ—΄μ—μ„œ μˆ˜ν–‰ν•  μž‘μ—…μ΄ μ—†λ‹€λ©΄

ν˜„μž¬ λ°©λ¬Έν•œ jobs μš”μ†Œμ˜ μš”μ²­ μ‹œκ°„μ„ ν˜„μž¬ μ‹œμ μœΌλ‘œ μ—…λ°μ΄νŠΈν•œλ‹€.

예λ₯Ό λ“€μ–΄, [[3, 5], [7, 8], [9, 6]]λΌλŠ” μž‘μ—… λͺ©λ‘μ€ 첫 번째둜 μˆ˜ν–‰ν•  μž‘μ—…μ΄ 3ms μ‹œμ μ— μš”μ²­ν•œλ‹€. ν˜„μž¬ μ‹œμ μ΄ 0ms라면 ν˜„μž¬ μ‹œμ μ„ 3ms둜 μ—…λ°μ΄νŠΈ ν›„ λŒ€κΈ°μ—΄μ— μ‚½μž… 및 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•œλ‹€.

1
2
3
else {
  time = jobs[index][0];
}

🏹 μ½”λ“œ

μš°μ„ μˆœμœ„ 큐둜 κ΅¬ν˜„ν•˜λ €κ³  ν–ˆλŠ”λ° λ§‰ν˜€μ„œ λ‹€λ₯Έ λΈ”λ‘œκ·Έμ—μ„œ 배열을 ν™œμš©ν•œ 풀이λ₯Ό μ°Έκ³ ν•΄μ„œ ν•΄κ²°ν–ˆλ‹€.

🐝 참고

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/Javascript] λ””μŠ€ν¬ 컨트둀러

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const solution = (jobs) => {
  const priorityQueue = [];

  let time = 0,
    index = 0,
    result = 0;

  jobs.sort((a, b) => a[0] - b[0]);

  // jobs 순회λ₯Ό 끝내지 μ•Šμ•˜κ±°λ‚˜ λŒ€κΈ°μ—΄μ΄ λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ μž‘μ—…μ„ 계속 μˆ˜ν–‰ν•œλ‹€.
  while (index < jobs.length || priorityQueue.length > 0) {
    if (index < jobs.length && time >= jobs[index][0]) {
      priorityQueue.push(jobs[index++]);
      priorityQueue.sort((a, b) => a[1] - b[1]);

      continue;
    }

    if (priorityQueue.length > 0) {
      const [requestTime, workingTime] = priorityQueue.shift();
      time += workingTime;
      result += time - requestTime;
    } else {
      time = jobs[index][0];
    }
  }

  // resultλŠ” 각 μž‘μ—…μ˜ 총 μ†Œμš” μ‹œκ°„μ„ λˆ„μ λ˜μ–΄μžˆμœΌλ―€λ‘œ 평균을 μœ„ν•΄ μž‘μ—…μ˜ 수만큼 λ‚˜λˆˆ ν›„ λ°˜ν™˜ν•œλ‹€.
  return parseInt(result / jobs.length);
};

⛳️ 더 쒋은 ν•΄κ²°μ±…

μœ„μ—μ„œ μ–ΈκΈ‰ν•œλŒ€λ‘œ μ›λž˜λŠ” νž™μœΌλ‘œ κ΅¬ν˜„ν•˜λ €κ³  ν•˜μ˜€λ‹€. 클래슀둜 Heap을 μ„ μ–Έν•˜κ³  μž‘μ—… λͺ©λ‘μ„ μˆœνšŒν•˜λ©° ν•΄κ²°ν•œ 포슀트λ₯Ό λ°œκ²¬ν•˜μ—¬ 남겨둔닀.

Heap 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°°μ—΄μ˜ shiftλ‚˜ sort μž‘μ—…μ„ ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 더 λΉ λ₯΄λ‹€.

heap_and_array_time_complexity (μ°Έκ³  : λ°°μ—΄λ‘œ κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό μ°Έκ³ ν•œ λΈ”λ‘œκ·Έμ˜ λŒ“κΈ€)

직접 각각의 μ½”λ“œλ₯Ό 돌렀보면 μ•„λž˜μ™€ 같이 λ‚˜μ˜¨λ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ•Œ 수 μ—†μœΌλ‚˜, 쀑간쀑간 νž™μ„ μ‚¬μš©ν•  것과 λ°°μ—΄λ‘œ μ‚¬μš©ν•œ κ²ƒμ˜ μ‹œκ°„μ΄ 크게 μ°¨μ΄λ‚˜λŠ” μΌ€μ΄μŠ€κ°€ λ³΄μ΄λŠ”λ° μ•„λ§ˆ μž‘μ—… 데이터가 많이 λ“€μ–΄μ˜¨ μΌ€μ΄μŠ€κ°€ μ•„λ‹κΉŒ 생각이 λ“ λ‹€. 더 쒋은 해결책이라기 λ³΄λ‹€λŠ” λ‚΄κ°€ ν•΄κ²°ν•˜μ§€ λͺ»ν•œ λ°©λ²•μœΌλ‘œ μΆ©λΆ„νžˆ ν•΄κ²° κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μΈμ§€ν•˜κΈ° μœ„ν•΄ 남겨둔닀!

test_result

🐝 참고

[javascript] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λ””μŠ€ν¬ 컨트둀러

This post is licensed under CC BY 4.0 by the author.

πŸ“Έ 2022-10-30

πŸ“Έ 2022-11-02