boj 11404번 문제를 풀며 접하게 된 fill 함수에 대하여.

fill 함수를 

    for(int i=1; i<=n; i++){
        fill(d[i],d[i]+1+n,INF);
    }

이런식으로 사용하여서 초기에 d[105][105] 배열을 무한대로 초기화 하는 코드를 작성할때, 

이때에 fill을 이용해서 초기화를 하는 코드를 보았는데, 

이때에 fill(d[i]+1,d[i]+1+n,INF); 형태로 작성하는것이 의미상 맞는 것이고, +1을 제외하면서 0번째 인덱스에서의 값도 INF로 초기화

된다고 생각하여서 fill과 관련된 것들을 찾아보았다. 

https://cplusplus.com/reference/algorithm/fill/?kw=fill 

 

https://cplusplus.com/reference/algorithm/fill/?kw=fill

12345678 template void fill (ForwardIterator first, ForwardIterator last, const T& val) { while (first != last) { *first = val; ++first; } }

cplusplus.com

 

일단 cplusplus 사이트를 통해서 알아본 fill의 경우는, first는 포함, last는 미포함이다. last의 하나 전 원소까지 fill을 통해 채워지게 된다.

 그렇기 때문에 d[i]+1+n을 통해서, d[i]+n 까지가 채워지게 되는 것이다. 만약 여기서 +1을 붙이지 않으면 틀리게 된다. 

fill이 위에 제시된 function과 equivalent 하다는걸 통해서, first==last가 되면 while문 내부의 연산이 수행되지 않으면서

last에서의 값은 변하지 않게 됨을 알 수 있고, 

Parameters에 대한 설명을 통해서도 포함관계가 [first,last) 라는걸 알 수 있다. 

이를 통해서 fill을 사용할때에 주의하도록 하자. 

 

그리고

 for(int i=1; i<=n; i++){

    fill(d[i]+1,d[i]+1+n,INF);

 

형태로 코드를 작성해도 제출하여도 통과하게 된다. 

+1을 붙이면서 1-indexed로 문제를 풀게 되는 것을 확실하게 나타내게 되고, 만약 이걸 제외하면

0부터 초기화 INF값으로 초기화 되는데, 이때에 이 값에 대한 접근을 하지 않기 때문에 상관이 없게 되는 것이다. 

fill(d[i], d[i]+1+n, INF); 로 초기화해도 되지만 그렇게 했을때와 d[i]+1을 했을때의 차이점에 대해서는 명확하게 구분하면서 사용해보도록 하자. 

 

  Comments,     Trackbacks