inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

44. 마구간 정하기 (이분검색 응용 : 결정 알고리즘)

44번 질문 있습니다

333

sang ji Choi

작성한 질문수 23

0

43번 문제는 이제 풀 수 있어서 44번 문제도 43번 처럼 진행했습니다. 그런데 3이 안나오고 다른 답만 나와서요 어디가 잘 못됐는지 알려주실수 있으실까요?

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,m, a[1001];
int dis(int x)
{
    int i,sum=0,cnt=1;
    for(i=1;i<=n;i++)
    {
        if(sum +a[i]>x)
        {
            sum = a[i];
            cnt++;
        }
        else sum=sum+a[i];
    }
    return cnt;
}

int main()
{
    int i,lt,rt=0,max=-2147000000,mid,res=0;
    cin >> n >>m;
    for(i=1;i<=n;i++)
    {
        cin >> a[i];
        rt +=a[i];
        if(max<a[i]) max=a[i];
    }
    lt = a[1];
    while(lt<=rt)
    {
        mid = (lt+rt)/2;
        if(mid>max && dis(mid)<=m)
        {
            res = mid;
            lt = mid+1;
        }
        else rt=mid-1;
    }
    cout << res;
    return 0;
}


 

 

c++ 코딩-테스트

답변 2

0

김태원

안녕하세요^^

위에 코드는 43번 코드인것 같은데요. 44번은 dis 함수가 위와는 전혀 다르게 해야 합니다. 44번 영상의 설명을 먼저 보시고 다시 코드를 짜보세요.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요. 제가 제공해드릴 수 있는 도움은 다소 제한적이지만, 최대한 노력해보도록 하겠습니다.

문제의 원인을 찾기 위해 코드를 살펴보았습니다. 코드상으로는 큰 문제가 보이지 않으며, 이분 탐색 알고리즘을 사용하여 문제를 해결하는 것으로 보입니다.

그러나 코드에서 몇 가지 수정이 필요한 부분을 찾았습니다.
1. Dis 함수에서 sum을 0으로 초기화하지 않고 답안에서 제시한 a[1] 값으로 초기화해야 합니다.
2. while문 안의 else문에서 mid에 -1을 하는 것이 아니라 rt 값을 mid-1로 설정해야 합니다.

다음은 수정된 코드입니다.

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m, a[1001];
int dis(int x)
{
    int i, sum = a[1], cnt = 1;
    for (i = 2; i <= n; i++)
    {
        if (sum + a[i] > x)
        {
            sum = a[i];
            cnt++;
        }
        else sum = sum + a[i];
    }
    return cnt;
}

int main()
{
    int i, lt, rt = 0, max = -2147000000, mid, res = 0;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        cin >> a[i];
        rt += a[i];
        if (max < a[i]) max = a[i];
    }
    lt = a[1];
    while (lt <= rt)
    {
        mid = (lt + rt) / 2;
        if (mid > max && dis(mid) <= m)
        {
            res = mid;
            lt = mid + 1;
        }
        else rt = mid - 1;
    }
    cout << res;
    return 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

166

1

질문있습니다.

0

193

2

시간초과가 나요

0

172

1

43번 문제 3 ~ 5번에 문제가 있는것 같습니다.

0

249

1