오늘은 릿코드에서 배열 관련된 알고리즘 문제를 복기 하기 위한 포스팅을 해볼까 합니다.

Two Pointer란?
- 배열을 순회 할 때 탐색 포인터를 읽기, 쓰기를 분류하여 목적에 맞게 순회하는 방식

각 코드 블록을 살펴보면서 리뷰를 해보겠습니다.

먼저 wp = writre Point 와 rp = read Point 를 사용했습니다.
rp로 배열은 순회하면서 Index의 값을 변수 v에 할당합니다.
그리고 바로 밑에서 nums[Index] 값에 0으로 채워줍니다. 이 부분은 밑에서 다시 설명하겠습니다.

그 다음 v 값이 0이 아니면 nums배열의 wp 인덱스에 v 값을 할당합니다.
즉, nums배열의 1이 들어 왔을 때 "nums[0] = 1" 이 할당 되는 형태입니다.
다시 말해 위 로직이 0이 아닌 값들을 nums 배열을 재구성 하는 로직입니다.
그 다음 wp++를 추가시켜 nums 배열의 Index 값을 증강 시켜 줍니다.

표로 nums배열을 재구성한다면 아마 위처럼 재구성 될 것입니다. 0을 제외한 값들이 들어간다는 조건하에 말입니다.

그리고 다시 위 코드로 돌아와서 보면 for문에서 무조건으로 0을 채워주는 로직이 있습니다.
nums[rp] = 0;
즉, nums[Index]의 값을 0으로 채워주고 그 다음 v 값이 0이 아니면 wp로 값을 배열을 구성한 것입니다.

정리하자면, v 값이 0이 아니면 write Point로 값을 쓰고 증강시키면서 nums 배열을 재구성합니다.
그 다음 v 값이 0이 아니면 wp++가 이루어지지 않으므로, 해당 포인터의 역할을 전부 끝나게 됩니다.
결과적으로 이미 for문 앞쪽에서 nums[rp] = 0을 할당하여 나머지 nums배열의 Index 값에 0을 채워 넣어주기 때문에
[1,3,12,0,0] 이라는 결과가 최종적으로 도출 되게 됩니다.
마치며
- 생각보다 배열 관련된 문제가 다양한 방식으로 출제되어 고민을 많이 하게되는 문제였던거 같습니다.
다음에도 좋은 알고리즘 문제가 있다면 꾸준히 포스팅을 진행하겠습니다.