Skip to content

Commit 76a6d8b

Browse files
committed
[level 3] Title: 상담원 인원, Time: 618.59 ms, Memory: 16.9 MB -BaekjoonHub
1 parent a360a2a commit 76a6d8b

2 files changed

Lines changed: 333 additions & 0 deletions

File tree

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
# [level 3] 상담원 인원 - 214288
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/214288)
4+
5+
### 성능 요약
6+
7+
메모리: 16.9 MB, 시간: 618.59 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2023 현대모비스 알고리즘 경진대회 예선
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 04월 11일 18:31:59
20+
21+
### 문제 설명
22+
23+
<p>현대모비스는 우수한 SW 인재 채용을 위해 상시로 채용 설명회를 진행하고 있습니다. 채용 설명회에서는 채용과 관련된 상담을 원하는 참가자에게 멘토와 1:1로 상담할 수 있는 기회를 제공합니다. 채용 설명회에는 멘토 <code>n</code>명이 있으며, 1~<code>k</code>번으로 분류되는 상담 유형이 있습니다. 각 멘토는 <code>k</code>개의 상담 유형 중 하나만 담당할 수 있습니다. 멘토는 자신이 담당하는 유형의 상담만 가능하며, 다른 유형의 상담은 불가능합니다. 멘토는 동시에 참가자 한 명과만 상담 가능하며, 상담 시간은 정확히 참가자가 요청한 시간만큼 걸립니다. </p>
24+
25+
<p>참가자가 상담 요청을 하면 아래와 같은 규칙대로 상담을 진행합니다.</p>
26+
27+
<ul>
28+
<li>상담을 원하는 참가자가 상담 요청을 했을 때, 참가자의 상담 유형을 담당하는 멘토 중 상담 중이 아닌 멘토와 상담을 시작합니다.</li>
29+
<li>만약 참가자의 상담 유형을 담당하는 멘토가 모두 상담 중이라면, 자신의 차례가 올 때까지 기다립니다. <strong>참가자가 기다린 시간은 참가자가 상담 요청했을 때부터 멘토와 상담을 시작할 때까지의 시간입니다.</strong> </li>
30+
<li>모든 멘토는 상담이 끝났을 때 자신의 상담 유형의 상담을 받기 위해 기다리고 있는 참가자가 있으면 즉시 상담을 시작합니다. 이때, <strong>먼저 상담 요청한 참가자가 우선됩니다.</strong></li>
31+
</ul>
32+
33+
<p>참가자의 상담 요청 정보가 주어질 때, 참가자가 상담을 요청했을 때부터 상담을 시작하기까지 기다린 시간의 합이 최소가 되도록 각 상담 유형별로 멘토 인원을 정하려 합니다. <strong>단, 각 유형별로 멘토 인원이 적어도 한 명 이상이어야 합니다.</strong> </p>
34+
35+
<p>예를 들어, 5명의 멘토가 있고 1~3번의 3가지 상담 유형이 있을 때 아래와 같은 참가자의 상담 요청이 있습니다.</p>
36+
37+
<p><strong>참가자의 상담 요청</strong></p>
38+
<table class="table">
39+
<thead><tr>
40+
<th>참가자 번호</th>
41+
<th>시각</th>
42+
<th>상담 시간</th>
43+
<th>상담 유형</th>
44+
</tr>
45+
</thead>
46+
<tbody><tr>
47+
<td>1번 참가자</td>
48+
<td>10분</td>
49+
<td>60분</td>
50+
<td>1번 유형</td>
51+
</tr>
52+
<tr>
53+
<td>2번 참가자</td>
54+
<td>15분</td>
55+
<td>100분</td>
56+
<td>3번 유형</td>
57+
</tr>
58+
<tr>
59+
<td>3번 참가자</td>
60+
<td>20분</td>
61+
<td>30분</td>
62+
<td>1번 유형</td>
63+
</tr>
64+
<tr>
65+
<td>4번 참가자</td>
66+
<td>30분</td>
67+
<td>50분</td>
68+
<td>3번 유형</td>
69+
</tr>
70+
<tr>
71+
<td>5번 참가자</td>
72+
<td>50분</td>
73+
<td>40분</td>
74+
<td>1번 유형</td>
75+
</tr>
76+
<tr>
77+
<td>6번 참가자</td>
78+
<td>60분</td>
79+
<td>30분</td>
80+
<td>2번 유형</td>
81+
</tr>
82+
<tr>
83+
<td>7번 참가자</td>
84+
<td>65분</td>
85+
<td>30분</td>
86+
<td>1번 유형</td>
87+
</tr>
88+
<tr>
89+
<td>8번 참가자</td>
90+
<td>70분</td>
91+
<td>100분</td>
92+
<td>2번 유형</td>
93+
</tr>
94+
</tbody>
95+
</table>
96+
<p>이때, 멘토 인원을 아래와 같이 정하면, 참가자가 기다린 시간의 합이 25로 최소가 됩니다.</p>
97+
<table class="table">
98+
<thead><tr>
99+
<th>1번 유형</th>
100+
<th>2번 유형</th>
101+
<th>3번 유형</th>
102+
</tr>
103+
</thead>
104+
<tbody><tr>
105+
<td>2명</td>
106+
<td>1명</td>
107+
<td>2명</td>
108+
</tr>
109+
</tbody>
110+
</table>
111+
<p><strong>1번 유형</strong></p>
112+
113+
<p>1번 유형을 담당하는 멘토가 2명 있습니다.</p>
114+
115+
<ul>
116+
<li>1번 참가자가 상담 요청했을 때, 멘토#1과 10분~70분 동안 상담을 합니다.</li>
117+
<li>3번 참가자가 상담 요청했을 때, 멘토#2와 20분~50분 동안 상담을 합니다.</li>
118+
<li>5번 참가자가 상담 요청했을 때, 멘토#2와 50분~90분 동안 상담을 합니다.</li>
119+
<li>7번 참가자가 상담 요청했을 때, 모든 멘토가 상담 중이므로 1번 참가자의 상담이 끝날 때까지 5분 동안 기다리고 멘토#1과 70분~100분 동안 상담을 합니다. </li>
120+
</ul>
121+
122+
<p><strong>2번 유형</strong></p>
123+
124+
<p>2번 유형을 담당하는 멘토가 1명 있습니다.</p>
125+
126+
<ul>
127+
<li>6번 참가자가 상담 요청했을 때, 멘토와 60분~90분 동안 상담을 합니다.</li>
128+
<li>8번 참가자가 상담 요청했을 때, 모든 멘토가 상담 중이므로 6번 참가자의 상담이 끝날 때까지 20분 동안 기다리고 90분~190분 동안 상담을 합니다.</li>
129+
</ul>
130+
131+
<p><strong>3번 유형</strong></p>
132+
133+
<p>3번 유형을 담당하는 멘토가 2명 있습니다.</p>
134+
135+
<ul>
136+
<li>2번 참가자가 상담 요청했을 때, 멘토#1과 15분~115분 동안 상담을 합니다.</li>
137+
<li>4번 참가자가 상담 요청했을 때, 멘토#2와 30분~80분 동안 상담을 합니다.</li>
138+
</ul>
139+
140+
<p>상담 유형의 수를 나타내는 정수 <code>k</code>, 멘토의 수를 나타내는 정수 <code>n</code>과 참가자의 상담 요청을 담은 2차원 정수 배열 <code>reqs</code>가 매개변수로 주어집니다. 멘토 인원을 적절히 배정했을 때 참가자들이 상담을 받기까지 기다린 시간을 모두 합한 값의 최솟값을 return 하도록 solution 함수를 완성해 주세요.</p>
141+
142+
<hr>
143+
144+
<h5>제한사항</h5>
145+
146+
<ul>
147+
<li>1 ≤ <code>k</code> ≤ 5</li>
148+
<li><code>k</code> ≤ <code>n</code> ≤ 20</li>
149+
<li>3 ≤ <code>reqs</code>의 길이 ≤ 300
150+
151+
<ul>
152+
<li><code>reqs</code>의 원소는 [<code>a</code>, <code>b</code>, <code>c</code>] 형태의 길이가 3인 정수 배열이며, <code>c</code>번 유형의 상담을 원하는 참가자가 <code>a</code>분에 <code>b</code>분 동안의 상담을 요청했음을 의미합니다.</li>
153+
<li>1 ≤ <code>a</code> ≤ 1,000</li>
154+
<li>1 ≤ <code>b</code> ≤ 100</li>
155+
<li>1 ≤ <code>c</code> ≤ <code>k</code></li>
156+
<li><code>reqs</code>는 <code>a</code>를 기준으로 오름차순으로 정렬되어 있습니다.</li>
157+
<li><code>reqs</code> 배열에서 <code>a</code>는 중복되지 않습니다. 즉, 참가자가 상담 요청한 시각은 모두 다릅니다.</li>
158+
</ul></li>
159+
</ul>
160+
161+
<hr>
162+
163+
<h5>입출력 예</h5>
164+
<table class="table">
165+
<thead><tr>
166+
<th>k</th>
167+
<th>n</th>
168+
<th>reqs</th>
169+
<th>result</th>
170+
</tr>
171+
</thead>
172+
<tbody><tr>
173+
<td>3</td>
174+
<td>5</td>
175+
<td>[[10, 60, 1], [15, 100, 3], [20, 30, 1], [30, 50, 3], [50, 40, 1], [60, 30, 2], [65, 30, 1], [70, 100, 2]]</td>
176+
<td>25</td>
177+
</tr>
178+
<tr>
179+
<td>2</td>
180+
<td>3</td>
181+
<td>[[5, 55, 2], [10, 90, 2], [20, 40, 2], [50, 45, 2], [100, 50, 2]]</td>
182+
<td>90</td>
183+
</tr>
184+
</tbody>
185+
</table>
186+
<hr>
187+
188+
<h5>입출력 예 설명</h5>
189+
190+
<p><strong>입출력 예 #1</strong></p>
191+
192+
<p>문제 예시와 같습니다.</p>
193+
194+
<p><strong>입출력 예 #2</strong></p>
195+
196+
<p><strong>참가자의 상담 요청</strong></p>
197+
<table class="table">
198+
<thead><tr>
199+
<th>참가자 번호</th>
200+
<th>시각</th>
201+
<th>상담 시간</th>
202+
<th>상담 유형</th>
203+
</tr>
204+
</thead>
205+
<tbody><tr>
206+
<td>1번 참가자</td>
207+
<td>5분</td>
208+
<td>55분</td>
209+
<td>2번 유형</td>
210+
</tr>
211+
<tr>
212+
<td>2번 참가자</td>
213+
<td>10분</td>
214+
<td>90분</td>
215+
<td>2번 유형</td>
216+
</tr>
217+
<tr>
218+
<td>3번 참가자</td>
219+
<td>20분</td>
220+
<td>40분</td>
221+
<td>2번 유형</td>
222+
</tr>
223+
<tr>
224+
<td>4번 참가자</td>
225+
<td>50분</td>
226+
<td>45분</td>
227+
<td>2번 유형</td>
228+
</tr>
229+
<tr>
230+
<td>5번 참가자</td>
231+
<td>100분</td>
232+
<td>50분</td>
233+
<td>2번 유형</td>
234+
</tr>
235+
</tbody>
236+
</table>
237+
<p>멘토 인원을 아래와 같이 정하면, 참가자가 기다린 시간의 합이 90으로 최소가 됩니다.</p>
238+
<table class="table">
239+
<thead><tr>
240+
<th>1번 유형</th>
241+
<th>2번 유형</th>
242+
</tr>
243+
</thead>
244+
<tbody><tr>
245+
<td>1명</td>
246+
<td>2명</td>
247+
</tr>
248+
</tbody>
249+
</table>
250+
<p><strong>1번 유형</strong></p>
251+
252+
<p>1번 유형을 담당하는 멘토가 1명 있습니다. 1번 유형의 상담을 요청한 참가자가 없지만, 유형별로 멘토 인원이 적어도 한 명 이상이어야 합니다.</p>
253+
254+
<p><strong>2번 유형</strong></p>
255+
256+
<p>2번 유형을 담당하는 멘토가 2명 있습니다. </p>
257+
258+
<ul>
259+
<li>1번 참가자가 상담 요청했을 때, 멘토#1과 5분~60분 동안 상담을 합니다. </li>
260+
<li>2번 참가자가 상담 요청했을 때, 멘토#2와 10분~100분 동안 상담을 합니다. </li>
261+
<li>3번 참가자가 상담 요청했을 때, 모든 멘토가 상담 중이므로 1번 참가자의 상담이 끝날 때까지 40분 동안 기다리고 멘토#1과 60분~100분 동안 상담을 합니다. 1번 참가자의 상담이 끝났을 때 4번 참가자도 기다리고 있었지만, 먼저 상담 요청한 3번 참가자가 우선됩니다.</li>
262+
<li>4번 참가자가 상담 요청했을 때, 모든 멘토가 상담 중이므로 2번 참가자의 상담이 끝날 때까지 50분 동안 기다리고 멘토#2와 100분~145분 동안 상담을 합니다. 이때, 멘토#1과 상담할 수도 있지만 어느 멘토와 상담해도 상관없습니다.</li>
263+
<li>5번 참가자가 상담 요청했을 때, 멘토#1과 100분~150분 동안 상담을 합니다. </li>
264+
</ul>
265+
266+
<p>따라서 90을 return 하면 됩니다.</p>
267+
268+
269+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
fileprivate func distributeInAdviceKind(_ n: Int, _ k: Int) -> [[Int]] {
2+
func distributePeople(_ n: Int, _ k: Int, _ startIndex: Int, _ currentDistribution: inout [Int], _ result: inout [[Int]]) {
3+
if k == 1 {
4+
currentDistribution[startIndex] = n
5+
result.append(currentDistribution)
6+
currentDistribution[startIndex] = 0
7+
return
8+
}
9+
10+
for i in 1...(n-k+1) { // n-k+1은 특정 상담 종류에 넣을 수 있는 최대 인원 수
11+
currentDistribution[startIndex] = i
12+
distributePeople(n-i, k-1, startIndex+1, &currentDistribution, &result)
13+
}
14+
currentDistribution[startIndex] = 0
15+
}
16+
var result = [[Int]]()
17+
var currentDistribution = Array(repeating: 0, count: k)
18+
distributePeople(n, k, 0, &currentDistribution, &result)
19+
return result
20+
}
21+
22+
func clacTotalWatingTime(k: Int, mento: [Int], reqs: [[Int]]) -> Int {
23+
var watingTime = 0
24+
var heapList = (0..<k).map { _ in [Int]() }
25+
mento.enumerated().forEach { i, v in
26+
(0..<v).forEach { _ in heapList[i].append(0)
27+
}
28+
}
29+
reqs.forEach { req in
30+
let startTime = req[0]
31+
let duration = req[1]
32+
let type = req[2]-1
33+
34+
let mentoTime = heapList[type].removeLast()
35+
36+
if mentoTime > startTime {
37+
let curWatingTime = mentoTime - startTime
38+
let nextMentoTime = mentoTime + duration
39+
heapList[type].append(nextMentoTime)
40+
watingTime += curWatingTime
41+
42+
} else if mentoTime == startTime {
43+
let nextMentoTime = mentoTime + duration
44+
heapList[type].append(nextMentoTime)
45+
46+
} else if mentoTime < startTime {
47+
let nextMentoTime = startTime + duration
48+
heapList[type].append(nextMentoTime)
49+
}
50+
heapList[type].sort { $0 > $1 }
51+
}
52+
53+
return watingTime
54+
}
55+
56+
func solution(_ k:Int, _ n:Int, _ reqs:[[Int]]) -> Int {
57+
// req = [요청시간, 걸리는 시간, 유형]
58+
// k 유형
59+
// n 가용 멘토 인원
60+
let comb = distributeInAdviceKind(n, k)
61+
let ret = comb.map { clacTotalWatingTime(k: k, mento: $0, reqs: reqs) }.min()!
62+
63+
return ret
64+
}

0 commit comments

Comments
 (0)