inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

43. 뮤직비디오 (이분검색 응용 : 결정 알고리즘)

43번 뮤직비디오 질문

240

김보성

작성한 질문수 13

0

안녕하세요 강사님 🙂

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;

}

c++ 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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이 아닌, 더 낮은 값을 찾을 수 있을 것입니다.

코드의 올바른 실행 여부는 실제로 입력 값을 제공하고 코드를 실행하여 결과를 확인함으로써 검증할 수 있습니다. 혹시 문제가 있다면, 강사님 또는 인프런 커뮤니티를 통해 추가적인 해설이나 도움을 받으실 수 있습니다.

감사합니다.

0

김보성

문제에 정렬해라는 말이 없는데 정렬을 한 뒤 계산을 하고 있었군요.. 해당 부분 확인했습니다

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