인프런 커뮤니티 질문&답변

공부합시다님의 프로필 이미지

작성한 질문수

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

6주차 개념 #1. 이분탐색(Binary Search)

강사님 LIS 설명해주실때..

작성

·

395

0

maxValue가 정확히 어떤 역할을 하는지 조금 더 자세하게 알려주실수 있으실까요..? 처음 접하는 개념인데 넘 빠르게 지나가서 잘 모르겠습니다..

감사합니다

답변 2

0

감사합니다 강사님

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 공부님 ㅎㅎ

음 이코드 말씀하시는거죠?

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n, a[1001], cnt[1001], ret;
int main(){
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", a + i);
    }
    for (int i = 0; i < n; i++) {
      int maxValue = 0;
      for (int j = 0; j < i; j++) {
        if (a[j] < a[i] && maxValue < cnt[j]) maxValue = cnt[j];
      }
      cnt[i] = maxValue +1;
      ret = max(ret,cnt[i]);
    }
    printf("%d\n", ret);
}

자, 저 maxValue는 최대의 cnt를 만들기 위한 임시 변수입니다.

예를 들어

10 20 10 20 30 이 있다고 해볼게요.

처음입니다. maxValue는 0이기 때문에 0 + 1을 해서 1입니다.

10 20 10 20 30

1

이상태에서

20을 탐색을 해나갑니다. 20보다 작은 수는 10이죠? 이 10의 cnt값은 1입니다. 여기에다 + 1을 한게 20의 lis가 되는 것이죠.

10 20 10 20 30

1 2

 

그러나 10보다 작은 수는 존재하지 않습니다.

10 20 10 20 30

1 2 1

 

그 다음으로 가서 20보다 작은 수를 보니 10밖에 없습니다. maxValue는 10의 cnt값을 가져옵니다. 여기서 maxValue는 1입니다. 20보다 작은 수, 그리고 최대의 cnt를 만들기 위한 임시 변수는 1로 담겼다가

10 20 10 20 30

1 2 1 2

나중에

      cnt[i] = maxValue +1;

이걸 거쳐서 cnt에는 2가 담기게 됩니다.

 

그 다음, 30으로 가서 30보다 작은 수, 10, 20 이 있습니다. maxValue는 10의 cnt, 20의 cnt 를 거치는데 원래 maxValue가 1이였다 20의 cnt를 거치면서 maxValue = 2가 됩니다.

왜냐하면

        if (a[j] < a[i] && maxValue < cnt[j]) maxValue = cnt[j];

앞의 코드에 부합하면서

10 >> maxValue = 0, 10의 cnt : 1 >>>

maxValue = 1 을거쳐...

20 >> maxValue = 1, 20의 cnt : 2 >>>

maxValue = 2가 되는 것이죠.

10 20 10 20 30

1 2 1 2 3

그렇게 해서 해당 cnt에는 +1을 한 3이 담기게 됩니다.

 

또한, 공부님 앞으로 공부하실 때 문제 링킹좀 부탁드립니다.

해당 부분은 0주차 질문하는법 보시면 나와있어요. ㅎㅎ

 

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

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

감사합니다.

강사 큰돌 올림.