inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

6-B

6-B 질문있습니다.

294

Maruche

작성한 질문수 14

0

강사님의 로직이 잘 이해가 가지 않습니다.

처음 문제를 풀 때 모든 블루레이를 사용해야 한다 고 생각해서 계속 오답이 나왔었는데요, 그 부분을 지우고 (cnt가 M과 같다는 조건문을 지우고) mid의 최소를 찾아 이분탐색 시켰더니 결국 통과는 했습니다.

그리고 강사님의 코드를 참고했는데, 동작방식이 잘 이해가 가지 않았습니다. 다음은 강사님 코드의 로직을 이해해보고 제 방식으로 수정해본 코드입니다.

bool check(int mid) {
    if (mx > mid) return false;
    int temp = mid;
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (mid - a[i] == 0)
        {
            ++cnt;
            mid = temp;
            continue;
        }
        else if (mid - a[i] < 0)
        {
            ++cnt;
            mid = temp;
            --i;
        }
        else
            mid -= a[i];
    }
    if (mid != temp) cnt++; 
    
    return cnt <= m;
}

else if (mid-a[i]<0) 의 조건문에서 i를 감소시켜서 다시 검사하게끔 하여 n+@의 순회를 합니다.

강사님은 이 부분을 최적화 하셔서 기존 14행과 같은 코드를 만드신 것 같은데요, 제가 제대로 이해한건지 (질의1)

제가 제대로 이해한게 맞다면, 처음부터 n회 순회만 하게끔 의도하셔서 코드를 작성하신건지 (처음 코드를 쓸 때부터 바로 저렇게 짜신건지) 아니면 최적화를 하다가 짜신건지 궁금합니다. (질의2)

저런 발상 자체를 해본적이 없어서 굉장히 낯선 코드를 보는 기분이었네요..

감사합니다.

c++ 코딩-테스트

답변 2

0

큰돌

안녕하세요 ㅎㅎ

강사님은 이 부분을 최적화 하셔서 기존 14행과 같은 코드를 만드신 것 같은데요, 제가 제대로 이해한건지 (질의1)

>> 네 맞습니다.

 

한번 그림을 그려봤는데요.

image

일단은 새로이 생성해야 하는 경우 같은 경우 cnt++, mid = temp가 되는 것은 당연합니다. 삐져나오게 되면.. 못넣게 되니까요.

그리고 일반적인 로직은 계속해서 빼야 하기 때문에 mid - v가 됩니다.

 

제가 제대로 이해한게 맞다면, 처음부터 n회 순회만 하게끔 의도하셔서 코드를 작성하신건지 (처음 코드를 쓸 때부터 바로 저렇게 짜신건지) 아니면 최적화를 하다가 짜신건지 궁금합니다. (질의2)

>> 처음부터 저렇게 짰습니다. 저렇게 그림 그리면서 짠 것 같습니다.

 

저런 발상 자체를 해본적이 없어서 굉장히 낯선 코드를 보는 기분이었네요..

>> 이게 음수를 활용하는 부분이라 그런 것 같은데요. 음수를 만들고 해당 음수를 기반으로 새로이 만들어야 하는 로직을 만들었다고 보시면 됩니다. Maruche님처럼 음수를 만들기전 체킹해서 하는 것도 괜찮고 음수를 기반으로 하는 것도 괜찮습니다.



 


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

Maruche님, 강사님의 로직에 대한 이해와 질문에 대해 상세히 설명해 주셔서 감사합니다.
질문에 대해 답변드리기 이전에, 강사님께서 제공한 원래의 코드나 기타 설명 자료가 없어 정확한 답변이 어려울 수 있음을 양해 부탁드립니다.

질의1에서 언급하신 최적화된 코드 이해 부분과 관련해서는, else if 조건 하에서 mid - a[i] < 0일 때 i를 감소시켜 이전 상태로 되돌리고 다음 반복으로 넘어가기 전에 cnt를 증가시키고 midtemp로 초기화하는 것은, 현재 블루레이의 크기(mid)가 현재 강의 길이(a[i])보다 작아 새로운 블루레이로 강의를 담아야 함을 의미합니다. 그리고 mid != temp 조건을 통해 남은 강의가 있다면 추가 해야 하는 블루레이 개수를 고려한 점이 맞습니다.

질의2에 대하여, 처음부터 n회 순회를 목표로 작성했는지, 아니면 초안 후 수정을 통해 최적화를 진행했는지는 강사님의 초기 의도나 코드 개발 과정을 알 수 없기 때문에 명확하게 말씀드릴 수 없습니다. 일반적으로는 코딩테스트나 알고리즘 문제 해결 시 시간복잡도를 고려하여 가능한 반복을 줄이는 방향으로 코드를 작성하려 합니다. 그러나 이것이 처음부터 의도된 것인지, 경험과 여러 번의 시도를 통해 최적화된 것인지는 과정을 알 수 없으면 추측만 가능합니다.

이 질문에 대한 구체적인 해답을 얻고 싶으시다면, 인프런의 수강 전 문의 게시판을 통해 강사님에게 직접 문의를 남기셔도 좋습니다. 해당하는 부분의 링크를 참고해주세요.

강의에 대한 추가적인 질문이나 더 필요한 정보가 있으시다면 언제든 문의해 주세요. Maruche님의 학습에 조금이나마 도움이 되셨기를 바랍니다. 감사합니다.

4 - A

0

7

1

코딩살구클럽 입장이 안됩니다

0

46

2

4-F 경우의 수 질문입니다.

0

30

2

코딩살구클럽 가입이 안됩니다.

0

62

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

51

1

교안 158페이지 문의드립니다

0

43

2

코딩살구클럽 관련 건의사항

0

104

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

44

1

진행 방법 질문드립니다!

0

78

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

63

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

307

2

백준 서비스 종료

9

942

1

sk 하이닉스 코테 대비

0

382

2

3-G 최댓값 질문

0

53

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

68

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

179

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

71

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2