From 585e22a530650f9982e5f8407ca3184dbe7948cb Mon Sep 17 00:00:00 2001 From: gani0325 Date: Sat, 9 Dec 2023 20:40:45 +0900 Subject: [PATCH] =?UTF-8?q?post:=20[8=EC=A3=BC=EC=B0=A8=5F=EC=9D=B4?= =?UTF-8?q?=EA=B0=80=EC=9D=80]=20=EC=83=81=EB=8B=B4=EC=9B=90=20=EC=9D=B8?= =?UTF-8?q?=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\233\220-\354\235\270\354\233\220.md" | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 "_posts/algorithm/\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220/2023-12-10-\354\235\264\352\260\200\354\235\200-\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220.md" diff --git "a/_posts/algorithm/\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220/2023-12-10-\354\235\264\352\260\200\354\235\200-\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220.md" "b/_posts/algorithm/\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220/2023-12-10-\354\235\264\352\260\200\354\235\200-\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220.md" new file mode 100644 index 0000000..5036f53 --- /dev/null +++ "b/_posts/algorithm/\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220/2023-12-10-\354\235\264\352\260\200\354\235\200-\354\203\201\353\213\264\354\233\220-\354\235\270\354\233\220.md" @@ -0,0 +1,161 @@ +--- +title: 🐒 상담원 인원 +author: gani0325 +date: 2023-12-10 20:00:00 +09:00 +categories: [μ•Œκ³ λ¦¬μ¦˜, 상담원 인원] +tags: [μ•Œκ³ λ¦¬μ¦˜, ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€, level2, 완전탐색, 8μ£Όμ°¨, 이가은] +render_with_liquid: false +--- + +## 1. 문제 링크 + +[상담원 인원](https://school.programmers.co.kr/learn/courses/30/lessons/214288) + +
+ +## 2. μ½”λ“œ + +```python +""" +상담원 인원 + +πŸ’› 문제 +ν˜„λŒ€λͺ¨λΉ„μŠ€λŠ” μš°μˆ˜ν•œ SW 인재 μ±„μš©μ„ μœ„ν•΄ μƒμ‹œλ‘œ μ±„μš© μ„€λͺ…νšŒλ₯Ό μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. +μ±„μš© μ„€λͺ…νšŒμ—μ„œλŠ” μ±„μš©κ³Ό κ΄€λ ¨λœ 상담을 μ›ν•˜λŠ” μ°Έκ°€μžμ—κ²Œ λ©˜ν† μ™€ 1:1둜 상담할 수 μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. +μ±„μš© μ„€λͺ…νšŒμ—λŠ” λ©˜ν†  nλͺ…이 있으며, 1~k번으둜 λΆ„λ₯˜λ˜λŠ” 상담 μœ ν˜•μ΄ μžˆμŠ΅λ‹ˆλ‹€. +각 λ©˜ν† λŠ” k개의 상담 μœ ν˜• 쀑 ν•˜λ‚˜λ§Œ λ‹΄λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. +λ©˜ν† λŠ” μžμ‹ μ΄ λ‹΄λ‹Ήν•˜λŠ” μœ ν˜•μ˜ μƒλ‹΄λ§Œ κ°€λŠ₯ν•˜λ©°, λ‹€λ₯Έ μœ ν˜•μ˜ 상담은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. +λ©˜ν† λŠ” λ™μ‹œμ— μ°Έκ°€μž ν•œ λͺ…κ³Όλ§Œ 상담 κ°€λŠ₯ν•˜λ©°, 상담 μ‹œκ°„μ€ μ •ν™•νžˆ μ°Έκ°€μžκ°€ μš”μ²­ν•œ μ‹œκ°„λ§ŒνΌ κ±Έλ¦½λ‹ˆλ‹€. + +μ°Έκ°€μžκ°€ 상담 μš”μ²­μ„ ν•˜λ©΄ μ•„λž˜μ™€ 같은 κ·œμΉ™λŒ€λ‘œ 상담을 μ§„ν–‰ν•©λ‹ˆλ‹€. + 상담을 μ›ν•˜λŠ” μ°Έκ°€μžκ°€ 상담 μš”μ²­μ„ ν–ˆμ„ λ•Œ, + μ°Έκ°€μžμ˜ 상담 μœ ν˜•μ„ λ‹΄λ‹Ήν•˜λŠ” λ©˜ν†  쀑 상담 쀑이 μ•„λ‹Œ λ©˜ν† μ™€ 상담을 μ‹œμž‘ν•©λ‹ˆλ‹€. + + λ§Œμ•½ μ°Έκ°€μžμ˜ 상담 μœ ν˜•μ„ λ‹΄λ‹Ήν•˜λŠ” λ©˜ν† κ°€ λͺ¨λ‘ 상담 쀑이라면, μžμ‹ μ˜ μ°¨λ‘€κ°€ 올 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€. + μ°Έκ°€μžκ°€ κΈ°λ‹€λ¦° μ‹œκ°„μ€ μ°Έκ°€μžκ°€ 상담 μš”μ²­ν–ˆμ„ λ•ŒλΆ€ν„° λ©˜ν† μ™€ 상담을 μ‹œμž‘ν•  λ•ŒκΉŒμ§€μ˜ μ‹œκ°„μž…λ‹ˆλ‹€. + + λͺ¨λ“  λ©˜ν† λŠ” 상담이 끝났을 λ•Œ μžμ‹ μ˜ 상담 μœ ν˜•μ˜ 상담을 λ°›κΈ° μœ„ν•΄ 기닀리고 μžˆλŠ” μ°Έκ°€μžκ°€ 있으면 μ¦‰μ‹œ 상담을 μ‹œμž‘ν•©λ‹ˆλ‹€. + μ΄λ•Œ, λ¨Όμ € 상담 μš”μ²­ν•œ μ°Έκ°€μžκ°€ μš°μ„ λ©λ‹ˆλ‹€. + +μ°Έκ°€μžμ˜ 상담 μš”μ²­ 정보가 μ£Όμ–΄μ§ˆ λ•Œ, +μ°Έκ°€μžκ°€ 상담을 μš”μ²­ν–ˆμ„ λ•ŒλΆ€ν„° 상담을 μ‹œμž‘ν•˜κΈ°κΉŒμ§€ κΈ°λ‹€λ¦° μ‹œκ°„μ˜ 합이 μ΅œμ†Œκ°€ λ˜λ„λ‘ +각 상담 μœ ν˜•λ³„λ‘œ λ©˜ν†  인원을 μ •ν•˜λ € ν•©λ‹ˆλ‹€. +단, 각 μœ ν˜•λ³„λ‘œ λ©˜ν†  인원이 적어도 ν•œ λͺ… 이상이어야 ν•©λ‹ˆλ‹€. + +🧑 μ œν•œ 사항 +1 ≀ k ≀ 5 +k ≀ n ≀ 20 +3 ≀ reqs의 길이 ≀ 300 + reqs의 μ›μ†ŒλŠ” [a, b, c] ν˜•νƒœμ˜ 길이가 3인 μ •μˆ˜ 배열이며, c번 μœ ν˜•μ˜ 상담을 μ›ν•˜λŠ” μ°Έκ°€μžκ°€ a뢄에 bλΆ„ λ™μ•ˆμ˜ 상담을 μš”μ²­ν–ˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. + 1 ≀ a ≀ 1,000 + 1 ≀ b ≀ 100 + 1 ≀ c ≀ k + reqsλŠ” aλ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. + reqs λ°°μ—΄μ—μ„œ aλŠ” μ€‘λ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, μ°Έκ°€μžκ°€ 상담 μš”μ²­ν•œ μ‹œκ°μ€ λͺ¨λ‘ λ‹€λ¦…λ‹ˆλ‹€. + +πŸ’š μž…μΆœλ ₯ +k n reqs result +3 5 [[10, 60, 1], [15, 100, 3], [20, 30, 1], [30, 50, 3], [50, 40, 1], 25 + [60, 30, 2], [65, 30, 1], [70, 100, 2]] +2 3 [[5, 55, 2], [10, 90, 2], [20, 40, 2], [50, 45, 2], [100, 50, 2]] 90 +""" + +# combinations(iterable, r) : μ›μ†Œμ˜ μˆ˜κ°€ r개인 μ‘°ν•© +# combinations_with_replacement(iterable, r) : μ›μ†Œμ˜ μˆ˜κ°€ r개인 쀑볡 μ‘°ν•© +# permutations(iterable, r) : λͺ‡ 개λ₯Ό 골라 μˆœμ„œλ₯Ό κ³ λ €ν•΄ λ‚˜μ—΄ν•œ 경우의 수 (μˆœμ—΄) +# heap μ΄μš©ν•΄ 상담 μ‹œκ°„μ΄ λΉ λ₯΄κ²Œ λλ‚˜λŠ” λ©˜ν† μ™€ λŒ€κΈ°μžμ˜ 상담 μ‹œκ°„μ„ λΉ„κ΅ν•˜μ—¬ λŒ€κΈ° μ‹œκ°„ κ΅¬ν•˜κΈ° + +import heapq +from itertools import combinations_with_replacement, permutations + +# 상담 μœ ν˜•μ˜ 수 k, λ©˜ν† μ˜ 수 n, μ°Έκ°€μžμ˜ 상담 μš”μ²­μ„ 담은 2차원 μ •μˆ˜ λ°°μ—΄ reqs +def solution(k, n, reqs): + answer = 1e9 + + consulting = [[] for _ in range(k)] + # [a, b, c] ν˜•νƒœμ˜ 길이가 3인 μ •μˆ˜ λ°°μ—΄ + # c번 μœ ν˜•μ˜ 상담을 μ›ν•˜λŠ” μ°Έκ°€μžκ°€ a뢄에 bλΆ„ λ™μ•ˆμ˜ 상담을 μš”μ²­ + for i in reqs: + # consulting[μœ ν˜•λ³„] = [μ‹œκ°„, μƒλ‹΄μ‹œκ°„] + # [[[10, 60], [20, 30], [50, 40], [65, 30]], [[60, 30], [70, 100]], [[15, 100], [30, 50]]] + consulting[i[2] - 1].append([i[0], i[1]]) + # λ©˜ν†  배치 + mento = set() + # μ΅œμ†Œ 각 μœ ν˜•μ— λ‚˜μ˜¬ 수 μžˆλŠ” λ©˜ν†  수 (각 μœ ν˜•λ³„λ‘œ λ©˜ν†  인원이 적어도 ν•œ λͺ… 이상이어야 함) + arr = [i for i in range(1, n - k + 2)] + + # ex) k = 3 이라면, 쀑볡 μ‘°ν•© -> (1, 1, 3), (1, 2, 2) ... + for mem in combinations_with_replacement(arr, k): + # μ΅œμ†Œ 각 μœ ν˜•μ— λ‚˜μ˜¬ 수 μžˆλŠ” λ©˜ν†  수 & 쀑볡 μ‘°ν•© 된 경우의 수 합이 λ©˜ν†  μˆ˜μ™€ 같은지 + if mem not in mento and sum(mem) == n: + # κ°€λŠ₯ν•œ λͺ¨λ“  μˆœμ„œλ₯Ό λ°˜ν™˜ (μˆœμ—΄) + for p in permutations(mem, k): + mento.add(p) + print(consulting) + # mento : {(1, 1, 3), (1, 3, 1), (1, 2, 2), (2, 1, 2), (2, 2, 1), (3, 1, 1)} + for case in mento: + result = 0 + + for i in range(k): + # λ©˜ν† μ˜ 수 [0], [0, 0, 0] ... + heap = [0] * case[i] + + # consulting[상담 μœ ν˜•] : [μ‹œκ°„, 상담 μ‹œκ°„] + for startTime, consultingTime in consulting[i]: + # λͺ¨λ“  값을 popν•œ κ²°κ³Όλ₯Ό 보면, μž‘μ€ κ°’ μˆœμ„œ(μ˜€λ¦„μ°¨μˆœ)둜 좜λ ₯된 것 + prev = heapq.heappop(heap) + # μ‹œμž‘μ‹œκ°„μ΄ 이전 μ’…λ£Œ μ‹œκ°„λ³΄λ‹€ μž‘λ‹€λ©΄ λ°”λ‘œ 진행 + if startTime >= prev: + # μΆ”κ°€λœ μ›μ†Œκ°€ λΆ€λͺ¨λ³΄λ‹€ μž‘μœΌλ©΄ (μ΅œμ†Œ) νž™ ꡬ쑰가 μ•„λ‹ˆλ―€λ‘œ, λΆ€λͺ¨μ™€ 자리λ₯Ό λ°”κΎΌλ‹€ + heapq.heappush(heap, startTime + consultingTime) + # λŒ€κΈ° μ‹œκ°„ μΆ”κ°€ + else: + result += prev - startTime + heapq.heappush(heap, prev + consultingTime) + + # 쀑볡쑰합 + μˆœμ—΄λ‘œ κ΅¬ν•œ "λ©˜ν†  λ°°μ—΄μ˜ μ‘°ν•©" μ€‘μ—μ„œ, κ°€μž₯ μž‘μ€ λŒ€κΈ° μ‹œκ°„ + answer = min(answer, result) + + return answer + +``` + +- μ •ν™•μ„± + + μ •ν™•μ„± ν…ŒμŠ€νŠΈ + ν…ŒμŠ€νŠΈ 1 〉 톡과 (0.05ms, 10.4MB) + ν…ŒμŠ€νŠΈ 2 〉 톡과 (0.04ms, 10.4MB) + ν…ŒμŠ€νŠΈ 3 〉 톡과 (0.03ms, 10.4MB) + ν…ŒμŠ€νŠΈ 4 〉 톡과 (0.03ms, 10.2MB) + ν…ŒμŠ€νŠΈ 5 〉 톡과 (0.36ms, 10.3MB) + ν…ŒμŠ€νŠΈ 6 〉 톡과 (1.80ms, 10.2MB) + ν…ŒμŠ€νŠΈ 7 〉 톡과 (1.13ms, 10.3MB) + ν…ŒμŠ€νŠΈ 8 〉 톡과 (0.47ms, 10.3MB) + ν…ŒμŠ€νŠΈ 9 〉 톡과 (330.16ms, 10.5MB) + ν…ŒμŠ€νŠΈ 10 〉 톡과 (317.66ms, 10.5MB) + ν…ŒμŠ€νŠΈ 11 〉 톡과 (308.86ms, 10.5MB) + ν…ŒμŠ€νŠΈ 12 〉 톡과 (312.64ms, 10.4MB) + ν…ŒμŠ€νŠΈ 13 〉 톡과 (314.26ms, 10.4MB) + ν…ŒμŠ€νŠΈ 14 〉 톡과 (314.12ms, 10.4MB) + ν…ŒμŠ€νŠΈ 15 〉 톡과 (306.52ms, 10.4MB) + ν…ŒμŠ€νŠΈ 16 〉 톡과 (316.86ms, 10.5MB) + ν…ŒμŠ€νŠΈ 17 〉 톡과 (315.08ms, 10.5MB) + ν…ŒμŠ€νŠΈ 18 〉 톡과 (308.69ms, 10.4MB) + ν…ŒμŠ€νŠΈ 19 〉 톡과 (311.61ms, 10.5MB) + ν…ŒμŠ€νŠΈ 20 〉 톡과 (314.18ms, 10.4MB) + 채점 κ²°κ³Ό + μ •ν™•μ„±: 100.0 + 합계: 100.0 / 100.0 + +
+ +## 3. ν•΄μ„€ + +- λ©˜ν† κ°€ 상담 μœ ν˜• λ³„λ‘œ λ‚˜λ‰  수 μžˆλŠ” 경우의 수λ₯Ό κ΅¬ν•œλ‹€ + - 각 μœ ν˜•λ³„ 상담 μ‹œ μ΅œμ†Œ λ©˜ν† κ°€ ν•œλͺ… 이상이어야 함 + - λ©˜ν† κ°€ μ΅œμ†Œ, μ΅œλŒ€ λ‚˜μ˜¬ 수 μžˆλŠ” arr λ₯Ό κ΅¬ν•΄μ€Œ + - 쀑볡 μ‘°ν•©μœΌλ‘œ (arr, k) λ₯Ό ꡬ함 + - κ·Έμ€‘μ—μ„œ μˆœμ—΄λ‘œ μ—¬λŸ¬ μˆœμ„œλ₯Ό ꡬ함 (쀑볡 μ‘°ν•©, k) +- heap 을 톡해 κ°€μž₯ 적은 상담 μ‹œκ°„μ„ λΉ„κ΅ν•˜κΈ° + - μ‹œμž‘ μ‹œκ°„μ΄ 이전 μ’…λ£Œ μ‹œκ°„ 보닀 μž‘μœΌλ©΄ 상담 λ°”λ‘œ μ‹œμž‘ + - 이전 상담이 아직 μ•ˆ 끝났닀면 이전 상담 - 이제 μ‹œμž‘ν•΄μ•Ό ν•  상담 μ‹œκ°„ 을 λΉΌκ³  λˆ„μ  μ‹œν‚¨λ‹€, 그리고 이전 상담 μ‹œκ°„μ— 이제 μ‹œμž‘ν•΄μ•Ό ν•  상담 μ‹œκ°„μ„ λ„£μ–΄μ€€λ‹€