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을 했을때의 차이점에 대해서는 명확하게 구분하면서 사용해보도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
플로이드, 다익스트라, 벨만포드의 사용가능 상황 비교. (간략함) (0) | 2023.07.23 |
---|---|
boj 17182번 문제를 통해 다시 접하게된 next_permutation(); 에 대하여. (0) | 2023.07.18 |
플로이드 알고리즘을 활용한 풀이에서 거리를 무한대의 의미로 놓기 위해 사용하는 0x3f3f3f3f와 0x7fffffff에 대하여. (0) | 2023.07.16 |
boj 16486번 문제를 통해서 보는 c++에서의 소수점 몇번째 자리 자리수와 fixed와 precision(); (0) | 2023.07.14 |
boj 2250번 문제를 통해 접하게된 구조화된 바인딩(structed binding)과 &을 이용한 참조. (0) | 2023.07.07 |