Post

🐹 상담원 인원

1. 문제 링크

상담원 인원


2. μ½”λ“œ

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from itertools import product
from collections import deque

def check_consult_finish(consult_list, now_category, req_time):
    c_list = consult_list.copy()
    finish = 0
    while c_list:
        end_time, category = c_list.popleft()
        # 이전 μƒλ‹΄μœ ν˜•μ˜ λͺ¨λ“  상담 마무리 -> 상담 λ‚΄μ—­ μ—†μ• κΈ° 
        if category != now_category:
            return (0, deque([]))
        # ν˜„μž¬ μ‹œμ μ—μ„œ 이미 λλ‚œ 상담 확인
        if end_time <= req_time:
            finish += 1
            continue
        break
    
    cnt = finish
    while cnt:
        cnt -= 1
        consult_list.popleft()

    return (finish, consult_list)

def solution(k, n, reqs):
    # λ©˜ν†  nλͺ…
    mentor = range(1, n+1)
    reqs.sort(key=lambda x: x[2])

    # k개의 μœ ν˜•μœΌλ‘œ λ‚˜λˆ„λŠ” λͺ¨λ“  경우의 수 κ΅¬ν•˜κΈ° (μ€‘λ³΅μˆœμ—΄)
    consulting_permutations = [p for p in product(mentor, repeat=k) if sum(p) == n]
    
    min_value = int(1e9)
    # λ©˜ν†  상담 배치 λͺ¨λ“  경우
    for c in consulting_permutations:
        waiting = 0
        mentors = list(c)
        consult_list = deque([])
        for req in reqs:
            req_time, consult_time, category = req
            # κ°€μž₯ 빨리 λλ‚˜λŠ” 순으둜 λŒ€κΈ°
            consult_list = deque(sorted(consult_list, key=lambda x: x[0]))
            # λ©˜ν†  상담 λλ‚¬μœΌλ©΄ λŒλ €λ†“κΈ°
            cnt, c_list = check_consult_finish(consult_list, category, req_time)
            mentors[category-1] += cnt
            consult_list = c_list
            # λ°°μ •ν•  λ©˜ν† κ°€ μžˆμ„ μ‹œ(상담 λ°”λ‘œ κ°€λŠ₯)
            if mentors[category-1] > 0:
                mentors[category-1] -= 1
                consult_list.append((req_time + consult_time, category)) # 상담 λ°°μ •
            # λ°°μ •ν•  λ©˜ν† κ°€ 없을 μ‹œ(λŒ€κΈ° ν•„μš”)
            else:
                end_time, category = consult_list.popleft()
                waiting += end_time - req_time
                consult_list.append((end_time + consult_time, category)) # 상담 λ°°μ •
            
        min_value = min(min_value, waiting)

    return min_value
ν…ŒμŠ€νŠΈ 1 〉톡과 (0.03ms, 10.5MB)
ν…ŒμŠ€νŠΈ 2 〉톡과 (0.04ms, 10.4MB)
ν…ŒμŠ€νŠΈ 3 〉톡과 (0.04ms, 10.3MB)
ν…ŒμŠ€νŠΈ 4 〉톡과 (0.05ms, 10.4MB)
ν…ŒμŠ€νŠΈ 5 〉톡과 (1.47ms, 10.1MB)
ν…ŒμŠ€νŠΈ 6 〉톡과 (20.61ms, 10.3MB)
ν…ŒμŠ€νŠΈ 7 〉톡과 (6.40ms, 10.3MB)
ν…ŒμŠ€νŠΈ 8 〉톡과 (0.80ms, 10.3MB)
ν…ŒμŠ€νŠΈ 9 〉톡과 (1935.87ms, 10.6MB)
ν…ŒμŠ€νŠΈ 10 〉톡과 (2103.60ms, 10.6MB)
ν…ŒμŠ€νŠΈ 11 〉톡과 (1921.13ms, 10.6MB)
ν…ŒμŠ€νŠΈ 12 〉톡과 (1881.78ms, 10.5MB)
ν…ŒμŠ€νŠΈ 13 〉톡과 (1908.63ms, 10.5MB)
ν…ŒμŠ€νŠΈ 14 〉톡과 (2061.11ms, 10.5MB)
ν…ŒμŠ€νŠΈ 15 〉톡과 (2001.30ms, 10.5MB)
ν…ŒμŠ€νŠΈ 16 〉톡과 (1968.97ms, 10.5MB)
ν…ŒμŠ€νŠΈ 17 〉톡과 (1956.36ms, 10.5MB)
ν…ŒμŠ€νŠΈ 18 〉톡과 (2097.11ms, 10.6MB)
ν…ŒμŠ€νŠΈ 19 〉톡과 (2034.02ms, 10.7MB)
ν…ŒμŠ€νŠΈ 20 〉톡과 (1925.74ms, 10.5MB)


3. ν•΄μ„€

product(쀑볡 μˆœμ—΄)을 μ‚¬μš©ν•˜μ—¬ 각 상담 μœ ν˜•μ— λ©˜ν† λ₯Ό λ°°μΉ˜ν•˜λŠ” λͺ¨λ“  경우 consulting_permutationsλ₯Ό κ΅¬ν•œλ‹€. 각 상담 μœ ν˜•λ³„λ‘œ κ³„μ‚°ν•˜κΈ° μœ„ν•΄ reqλ₯Ό 상담 μœ ν˜•μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€. κ·Έ ν›„ λ‹€μŒκ³Ό 같은 연산을 ν•œλ‹€.

  1. ν˜„μž¬ 상담 리슀트((λλ‚˜λŠ” μ‹œκ°„, 상담 μœ ν˜•) ν˜•μ‹ 큐)에 λ“±λ‘λ˜μ–΄ μžˆλŠ” 경우λ₯Ό 상담이 빨리 λλ‚˜λŠ” 순으둜 μ •λ ¬ν•œλ‹€.
  2. 상담이 λλ‚œ λ©˜ν† λŠ” λŒ€κΈ° μžλ¦¬μ— λŒλ €λ†“λŠ”λ‹€(상담 μœ ν˜•(i)에 ν•΄λ‹Ήν•˜λŠ” mentors[i]에 1을 λ”ν•΄μ€Œ)

    μ΄λ•Œ, λ§Œμ•½ 상담 μœ ν˜•μ΄ ν˜„μž¬ ν™•μΈν•˜λŠ” 상담 μœ ν˜•κ³Ό λ‹€λ₯΄λ©΄(이전 번호 상담이 λͺ¨λ‘ 끝났닀면) 큐λ₯Ό λΉ„μ›Œμ€€λ‹€.

  3. 상담 λŒ€κΈ° 유무λ₯Ό νŒŒμ•…ν•œλ‹€
    1. 상담 λ°”λ‘œ κ°€λŠ₯ β†’ mentors[i]κ°€ 0 보닀 크닀(상담 κ°€λŠ₯ν•œ λ©˜ν† κ°€ λ‚¨μ•„μžˆλ‹€)

      μ΄λ•ŒλŠ” λ©˜ν†  수λ₯Ό ν•˜λ‚˜ 쀄인닀.

      λλ‚˜λŠ” μ‹œκ°„ = 상담 μš”μ²­μ‹œκ° + 상담 μ‹œκ°„μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜μ—¬ 상담 λ¦¬μŠ€νŠΈμ— λ„£μ–΄μ€€λ‹€.

    2. 상담 λŒ€κΈ° ν•„μš” β†’ mentors[i]κ°€ 0일 λ•Œ(상담 κ°€λŠ₯ν•œ λ©˜ν† κ°€ μ—†μŒ)

      λŒ€κΈ° ν›„ λ°”λ‘œ λ‹€μŒ λ©˜ν† λ‘œ λ„˜κΈ°κΈ° λ•Œλ¬Έμ— λ©˜ν†  μˆ˜λŠ” κ·ΈλŒ€λ‘œ 놔둔닀.

      κΈ°λ‹€λ¦° μ‹œκ°„ = 이전 상담 λλ‚˜λŠ” μ‹œκ°„ - 상담 μš”μ²­ μ‹œκ° 으둜 총 λŒ€κΈ° μ‹œκ°„μ— 더해쀀닀.

      λλ‚˜λŠ” μ‹œκ°„ = 이전 상담 λλ‚˜λŠ” μ‹œκ°„ + 상담 μ‹œκ°„μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜μ—¬ 상담 λ¦¬μŠ€νŠΈμ— λ„£μ–΄μ€€λ‹€.

μœ„μ˜ 연산을 마무리 ν–ˆμ„ λ•Œ λŒ€κΈ° μ‹œκ°„μ˜ μ΅œμ†Ÿκ°’μ„ λ¦¬ν„΄ν•œλ‹€.

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