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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""
상담원 인원

πŸ’› 문제
ν˜„λŒ€λͺ¨λΉ„μŠ€λŠ” μš°μˆ˜ν•œ 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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
      μ •ν™•μ„±  ν…ŒμŠ€νŠΈ
      ν…ŒμŠ€νŠΈ 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 을 톡해 κ°€μž₯ 적은 상담 μ‹œκ°„μ„ λΉ„κ΅ν•˜κΈ°
    • μ‹œμž‘ μ‹œκ°„μ΄ 이전 μ’…λ£Œ μ‹œκ°„ 보닀 μž‘μœΌλ©΄ 상담 λ°”λ‘œ μ‹œμž‘
    • 이전 상담이 아직 μ•ˆ 끝났닀면 이전 상담 - 이제 μ‹œμž‘ν•΄μ•Ό ν•  상담 μ‹œκ°„ 을 λΉΌκ³  λˆ„μ  μ‹œν‚¨λ‹€, 그리고 이전 상담 μ‹œκ°„μ— 이제 μ‹œμž‘ν•΄μ•Ό ν•  상담 μ‹œκ°„μ„ λ„£μ–΄μ€€λ‹€
This post is licensed under CC BY 4.0 by the author.