43번 뮤직비디오 질문
240
작성한 질문수 13
안녕하세요 강사님 🙂
43번 뮤직비디오의 채점 폴더의 2번 케이스의 output이 23이 되어야 하는게 아닌지 질문드립니다.
현재 2번 케이스
<input>
10 3
6 5 8 5 6 8 7 6 6 7
<output>
24
배열 정렬, 5 5 6 6 6 6 7 7 8 8
(5, 5, 6, 6) (6, 6, 7) (7, 8, 8)
(5, 5, 6, 6) = 22
(6, 6, 7) = 19
(7, 8, 8) = 23
24가 아닌 23이 최소 비용이 되는 값이 아닌지 질문드립니다
제가 작성한 코드
void swap(int* a, int* b) {
int temp = *a;
a = b;
*b = temp;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
int main() {
int N, M;
scanf_s("%d%d", &N, &M);
int* pN = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++) {
scanf_s("%d", &pN[i]);
}
// 배열 정렬
quickSort(pN, 0, N - 1);
int lt = 1, rt = 0;
// 배열의 모든 요소를 더하여 rt 초기화
for (int i = 0; i < N; i++) {
rt += pN[i];
}
while (true) {
int cnt = 0, sum = 0;
int mid = (lt + rt) / 2;
if (mid == lt)
{
printf("%d", rt);
break;
}
if (mid == rt)
{
printf("%d", rt);
break;
}
// 누적 합이 mid를 넘으면 카운트 증가
for (int i = 0; i < N; i++)
{
if ((sum + pN[i]) > mid)
{
sum = 0;
cnt++;
}
// 마지막 배열의 경우 카운트 증가
if (i == N - 1)
cnt++;
sum += pN[i];
}
// 카운트에 따라 이분 탐색 범위 조절
if (cnt <= M) {
rt = mid;
}
else {
lt = mid;
}
mid = (lt + rt) / 2;
}
// 동적 할당한 배열 메모리 해제
free(pN);
return 0;
}
break;
}
if (mid == rt)
{
printf("%d", rt);
break;
}
// 누적 합이 mid를 넘으면 카운트 증가
for (int i = 0; i < N; i++)
{
if ((sum + pN[i]) > mid)
{
sum = 0;
cnt++;
}
if (i == N - 1)
cnt++;
sum += pN[i];
}
// 카운트에 따라 이분 탐색 범위 조절
if (cnt <= M) {
rt = mid;
}
else {
lt = mid;
}
mid = (lt + rt) / 2;
}
// 동적 할당한 배열 메모리 해제
free(pN);
return 0;
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
뮤직비디오 문제에서 제시해 주신 경우를 잘 살펴보았습니다. 문제에서 분배할 수 있는 DVD의 최대 용량을 최소화하려면 이분 탐색을 제대로 수행하여 올바른 값을 찾아야 합니다. 제시해 주신 입력 값에 대한 답변은 다음과 같습니다.
뮤직비디오의 길이를 담은 배열을 정렬한 후, 이분 탐색을 통해 각 DVD에 들어갈 최대 용량을 결정합니다. 여기서 각각의 DVD는 최대 길이가 제한되어 있으므로 제대로 된 분배가 될 수 있도록 탐색해야 합니다.
제시해 주신 입력 값의 경우, DVD의 수가 3개로 제한되어 있고 각 길이가 5, 5, 6, 6, 6, 6, 7, 7, 8, 8 인 상황입니다.
이를 (5, 5, 6, 6), (6, 6, 7), (7, 8, 8)과 같이 나눴을 때, 각 DVD의 합은 22, 19, 23이 됩니다. 여기서 가장 긴 DVD는 길이가 23이므로 이는 가능한 하나의 답입니다.
하지만 문제에서 요구하는 것은 모든 DVD 중 ‘최대 용량을 가진 DVD의 길이를 최소화’하는 것이므로 이분 탐색 과정에서 최적의 값을 정확하게 찾아내야 합니다. 이는 각 DVD별 최대 용량이 처음부터 끝까지 동일하게 유지되는 것이 아니라, 각 이분 탐색 스텝에서 해당 범위 안에서 가능한 최소값을 찾기 위해 조절되어야 합니다.
제시하신 코드에서 이분 탐색 과정에 있어서 lt와 rt의 값을 업데이트하는 조건 중 cnt <= M일 때 rt를 mid로 업데이트하는 점이 중요한 요소입니다. 이 조건에 따라 이분 탐색을 반복하며 최적의 해를 찾아가는 과정에서 23이 아닌, 더 낮은 값을 찾을 수 있을 것입니다.
코드의 올바른 실행 여부는 실제로 입력 값을 제공하고 코드를 실행하여 결과를 확인함으로써 검증할 수 있습니다. 혹시 문제가 있다면, 강사님 또는 인프런 커뮤니티를 통해 추가적인 해설이나 도움을 받으실 수 있습니다.
감사합니다.
87번 채점 프로그램에 오류가 있는 것 같습니다.
0
89
2
그리디 파트
0
115
2
안녕하세요. 선생님(54번 코드 관련 문의)
0
141
2
테스트 파일 exit_coe_1, time_limit_exceeded 질문
0
143
1
C언어로 코드를 짜면 채점 시에 한 문제 빼고 시간 초과가 발생하는데 해결하는 방법이 있을까요?
0
172
1
19번 질문있습니다
0
123
1
6번 관련 채점오류입니다
0
88
2
22번 문제는 C로 풀어주신 건가요 C++로 풀어주신 건가요?
0
166
2
dev C++ 콘솔창 바로 닫힘
0
245
1
최신화하기
0
171
1
채점이 안되요...
1
261
1
안녕하세요 강사님 정렬에 대해서 설명이 조금 더 듣고 싶습니다.
0
113
1
45번 공주구하기 문제를 list를 이용해서 이렇게 풀어도 될까요?
0
155
1
39번 두 배열 합치기 문제 채점 오류인가 코드 오류인가
0
155
0
채점기에서 틀렸다고 나오는데 이유를 모르겠습니다.
0
149
2
해당 강의에서 C언어로만 진행하는 강의 문의 건
0
145
2
87번 문제 섬나라 아일랜드 질문
0
128
1
16번 문제에서 직접 답을 대입하면 정답이 나오는데 채점에서 wrong answer가 나옵니다.
0
149
1
40번 교집합 문제
0
166
1
43번 뮤직비디오 문제 테스트케이스 4번을 만족 못합니다.
0
170
1
41. 연속된 자연수의 합 문제 질문있습니다.
0
165
1
질문있습니다.
0
193
2
시간초과가 나요
0
172
1
43번 문제 3 ~ 5번에 문제가 있는것 같습니다.
0
248
1





