boj 1744번 문제를 풀다가, 구현을 참고하기 위해 코드를 보는 중에
ans += *(v.end() - 1) * *(v.end() - 2);
이런 코드를 보게 되었고, 처음에는 이 코드가 ans에 (v.end()-1)을 곱하고(*), (v.end()-2)도 곱한다(*)인줄 알았는데, 그럼 그 사이에 **로 작성된 부분은 *을 하나 더 써넣은 상태인가, 이건 그냥 *가 하나 없어도 똑같은건가 싶었는데,
의미를 찾아보다보니
*(v.end()-1)은 'v 벡터의 마지막 요소에 대한 포인터를 역참조하여 값을 얻는 것'을 의미한다. 이때 (v.end()-1) 은 iterator이다.
이와 관련하여서 지피티에 검색한 내용에 대해 첨부한다.
결국 내가 의문을 가지게 된 코드에서 사용된 첫번째 *(애스터리스크-별표)는 포인터(여기서는 iterator)에 대한 역참조(Dereference-디레퍼런스)를 통해서 통해서 해당 주소에 저장된 값을 가져오는 것이다. 이때에 v.end()-1 주소의 역참조는 v 벡터의 맨 마지막에 푸시백 된 원소의 값이다.
그리고 두번째 등장한 *은 두 수를 곱하는데 사용된 곱셈 연산자(Multiplication)이다.
그리고 세번째 등장한 *은 첫번째와 마찬가지로 포인터 역참조(Dereference)이다. 이때 v.end()-2는, v에 푸시백 된 맨 마지막 원소보다 하나 전 순서의 위치를 의미하고, 그 위치에 해당하는 값을 역참조로 가져오기 위해서 *(v.end()-2)형태로 작성되어 있는 것이다.
위에 질문에 대한 내용들을 전체적으로 종합해보면,
의미를 명확하게 하기 위해서는 저 코드의 경우
ans+=*(v.end()-1)*(*(v.end()-2));//첫번째 *은 역참조, 두번째 *는 곱하기, 세번째 *는 역참조.
형태로 작성이 되어야 할 것이다. 이때에 지피티에 질문을 하였을때
ans+=*(v.end()-1)**(v.end()-2); 은 잘못 작성된 코드입니다. 라고 하지만, 의미가 보는 이로 하여금 헷갈릴 수 있게 보일 순 있으나 코드를 실행하는데 있어서는 의도한 바 그대로 동작한다.
그래서 내가 코드를 작성하는데 있어서는 보는 사람을 위해서 명확하게 이해를 돕기 위해서는
ans+=*(v.end()-1)*(*(v.end()-2)); 형태로 작성하는게 좋을것 같다.
그리고 내가 *을 이용한 코드가 나왔을때, &을 떠올렸는데, 이때에 대한 질문의 답변으로,
라는 답변을 들을 수 있었고, 이에 대해서 *와 &의 차이에 대해서, 그리고 &을 통한 역참조가 가능한지에 대해서 질문을 해보았을때,
이러한 답변을 얻을 수 있었다.
이 답변의 경우 현재 약간 이해가 완벽하게 되어있지 않은 나에게 매우 중요한 답변이 될 수 있는 내용이라고 보여진다.
지금까지 &을 사용해서 문제들을 해결할때 &의 활용 방법에 대해서 생각해보면 대부분 &은 참조 타입을 선언해서 원본에 대한 복사가 아닌 원본을 사용할 수 있도록 하는데 있었던것 같다.
&의 활용에 대해서 추가적으로 질문을 해보았을때 얻은 답변을 보면 &의 활용을 어떤식으로 하는지에 대해서 이해하는데 도움이 될 것으로 보여진다.
그렇담 boj 1744번 문제의 해결을 위한 코드에서 의미하는 것은, iterator를 이용한 역참조이고, 이때에 & 을 이용한 역참조의 경우는 존재하지 않기 때문에, 역참조를 하기 위해서는 *을 사용해야 할것이다. value의 주소값을 가져올때나, 혹은 참조 타입을 선언할때 &을 사용한다는걸 이해하고, *의 활용에 대해서 익숙해지도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
boj 1439번 문제를 통해 접하게된 컴파일러상의 차이로 보여지는 string 의 -1번째 인덱스의 접근. (0) | 2023.05.27 |
---|---|
boj 1744번 문제를 통해 사용법을 익히게 되는 v.end()-1에 대하여. (0) | 2023.05.26 |
boj 11501번 문제를 통해 배우게되는, 이미 다 받아들인 값을 통해서는 역으로도 연산을 해나갈 수 있다는 점에 대하여. (0) | 2023.05.26 |
c++ 지속적으로 tmp 값을 쌓아나가다가 나중에 판별식에 도달했을때 사용하는 방법 (boj 1541) (0) | 2023.05.25 |
boj 1931번 문제를 통해 vector로 원소를 만들고 값을 복사해서 받아들일때와, 배열로 잡고 바로 cin으로 받아들일때의 메모리의 차이점. (0) | 2023.05.24 |