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

개발너무어려워요ㅠ님의 프로필 이미지
개발너무어려워요ㅠ

작성한 질문수

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

8-I

8 - I 코드내용 질문입니다!

작성

·

287

0

안녕하세요 선생님 수업 열심히 듣고있습니다!


http://boj.kr/44c2eee4e7d84583b105ede311497d38

선생님 코드에서 line 37~47까지 잘 이해가 되지 않아 질문드립니다.

문제를 어떻게 풀어야하는지에 대해서는 이해했습니다. 그래서 left, right로 나누는 것도 이해했고 tree_cnt, tree_sum으로 이전의 나무의 개수, 이전 나무들의 합을 구하는 것도 이해가 됐는데

  1. 왜 value++을 하는건가요? 현재 심는 나무의 값을 그대로 사용해야될 것 같은데.. 잘 이해가 안됩니다ㅠㅠ

  2. sum(tree_cnt, 1, value-1)에서 왜 value-1이 들어가는건가요? 제 생각에는 현재 위치까지를 파악해야하니까 i가 들어가야할 것 같은데...(물론 코드를 고쳐서 돌려보니 틀렸습니다) 잘 이해가 되지 않습니다... 비슷하게 다른 sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...

펜윅트리 너무 어렵네요... 강의 내용 반복해서듣고 외웠는데 정말 쉽지 않은 것 같습니다..ㅠㅠ

설명을 부탁드려도될까요?

답변 1

1

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

안녕하세요 개발님 ㅎㅎ

    for(int i = 1; i <= n; i++){
        cin >> value; value++;   
        if(i != 1){
            ll left = value * sum(tree_cnt, 1, value - 1) - sum(tree_sum, 1, value - 1);
            ll right = sum(tree_sum, value + 1, max_n) - value * sum(tree_cnt, value + 1, max_n);
            ret *= (left + right) % mod; 
            ret %= mod; 
        }   
        update(tree_cnt, value, 1);
        update(tree_sum, value, value);
    } 
  1. 왜 value++을 하는건가요? 현재 심는 나무의 값을 그대로 사용해야될 것 같은데.. 잘 이해가 안됩니다ㅠㅠ

>> 아 이거는 문제의 범위때문에 그래요.

문제의 범위를 보면 다음과 같습니다.

각각의 좌표는 200,000보다 작은 자연수 또는 0이다.

0이 들어갈 수 있죠. 근데 tree같은 경우 0번째가 아니라 1번째부터 채워나가야 하기 때문에 ++를 했습니다.

 

  1. sum(tree_cnt, 1, value-1)에서 왜 value-1이 들어가는건가요? 제 생각에는 현재 위치까지를 파악해야하니까 i가 들어가야할 것 같은데...(물론 코드를 고쳐서 돌려보니 틀렸습니다) 잘 이해가 되지 않습니다... 비슷하게 다른 sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...

>> left를 잠깐 볼게요. 볼게요. 4번나무의 위치가 4라고 했을 때 그 이전 나무들의 위치들은 4 미만인 4 - 1 이하의 위치를 갖겠죠? 그래서 value - 1입니다.

sum(tree_cnt, 1, value - 1) - sum(tree_sum, 1, value - 1);

 

sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...

>>

그림을 그려보면요. 저 빨간색 부분이 -1, +1이 되는 부분이에요.

image

나무를 심는다고 했을 때

left는 value - 1 ~ 1까지를 의미하구요.

right는 value + 1부터 최대값인 max_n까지를 의미하게 되는 것입니다. 내 오른쪽에 ~ 나무가 몇개야? 이런것을 구하기 위해서 말이죠.

우리가 내 왼쪽에 있는 사람은 내 위치에서 -1인 사람을 의미하잖아요? 그부분을 생각하시면 이해가 쉬우실 것같아요.

 

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

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

감사합니다.

강사 큰돌 올림.

선생님 그림까지..! 그림보니까 확 이해가 되네요! 감사합니다

개발너무어려워요ㅠ님의 프로필 이미지
개발너무어려워요ㅠ

작성한 질문수

질문하기