Closed yeongleej closed 1 month ago
🤔 시간복잡도 고려사항
1 ≤ k ≤ 5
k ≤ n ≤ 20
3 ≤ reqs의 길이 ≤ 300
[중복순열] 유형별로 상담원 분배하기 : O(n^k) == 20^5 약, 3,200,000
[우선순위큐] 상담하기 : 상담자 수 * 해당 유형의 상담자 중 가장 빨리 끝나는 상담자 찾기
💡 풀이 아이디어
상담원 분배하기 => 중복순열
상담하기 => 우선순위큐 이용
mento[]
: 각 유형별로 우선순위큐를 이용해 가장 상담이 빨리 끝나는 상담사 출력
endTime = mento[i].poll()
waitTime : (출력된 상담사의 끝나는 시간 - 멘티의 시작시간)
멘티의 상담 끝나는 시간
을 add 해서 상담원 인원수 맞춤우선 순위 큐
를 이용해서 상담 중인 인원이 끝나는 시간을 오름차순으로 저장// 만들 수 있는 모든 멘토의 조합을 구함
// @param remainig : depth번 째 유형에 사용할 수 있는 멘토의 수
private void makeConsultCombi(int k, int remaining, int depth) {
// 마지막 유형의 멘토까지 왔다면 남은 인원들 전부 추가 후 총 대기시간 계산
if (depth == k) {
consultCombi[depth] += remaining;
int totalWaitingTime = 0;
// 미리 계산한 대기 시간표로 총 대기 시간을 계산
for (int i = 1; i < k + 1; i++) {
totalWaitingTime += waitingTimes[i][consultCombi[i]];
}
minWaitingTime = Math.min(minWaitingTime, totalWaitingTime);
consultCombi[depth] -= remaining; // 백 트래킹
return;
}
for (int i = 1; i < remaining; i++) {
consultCombi[depth] += i; // depth번 째 유형에 i만큼의 멘토를 추가
makeConsultCombi(k, remaining - i, depth + 1); // 남은 멘토들로 다음 유형 탐색
consultCombi[depth] -= i; // 백 트래킹
}
}
// 1 1 3
// 1 2 2
// 1 3 1
// 2 1 2
// 2 2 1
// 3 1 1
순열 만드는 거 빡셌네요
🤔 시간복잡도 고려사항
💡 풀이 아이디어
counsel
: 상담 유형 별 상담 분리하기
dp
: 각 상담 별로 (1~최대가능)상담원을 분배했을때 대기 시간 구하기
우선순위 큐
이용
dfs
: 조합으로 최소 대기 시간을 가지는 상담자 배분 구하기
dfs(int depth, int cns, int k)
// 깊이(상담유형), 남은 상담자 수, 상담유형 개수조합 구현하기 더 연습하기,, 처리해야할 일이 뭉탱이로 주어지는거 잘 분리하기,,
🤔 시간복잡도 고려사항
1 <= k <= 5
, k <= n <= 20
이므로 모든 경우 확인해도 시간 충분💡 풀이 아이디어
처음엔 그냥 그리디,, 로만 풀 수 있을 줄 알았는데, 각 유형별로 멘토 인원이 한 명 이상이 되어야 하는 조건도 있고, 완탐으로 해야되더라구요!!,,, 역시 문제를 잘 읽어서 이해하고,, 잘 물어야겠다고 생각했습니다!
💡 풀이 아이디어
PriorityQueue
+ 구현🤔 시간복잡도 고려사항
PriorityQueue
를 사용해서 여러 작업
에서 가장 빨리 완료
할 수 있는 작업부터 처리하기여러 작업
: 유형별 상담 요청가장 빨리 완료
: 상담종료 시간이 가장 적은 사람부터 처리🤔 시간복잡도 고려사항 시간 복잡도 : n: 20, k=5 -> 주어진 조건 내 가능
💡 풀이 아이디어
조합
재귀적
으로 멘토 배정 조합 생성PriorityQueue
로 대기 시간 합산mentors.offer(Math.max(start, next) + ing);
조합 문제,,!! 처음 풀어봤는데 어렵네요 ㅠ_ㅠ 많이 풀어보겠습니다!