배열 순회 시 투 포인터 사용

KIM JEONG DONG·2023년 12월 10일

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

283.Move Zeroes

배열 nums가 주어 질 때 0 값만 맨 뒤로 이동시키는 알고리즘 문제입니다.

여기서 해당 문제를 풀 때 Two Pointer를 활용하여 문제를 해결 하였습니다.

Two Pointer란?

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

작성한 코드

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

먼저 wp = writre Point 와 rp = read Point 를 사용했습니다.

rp로 배열은 순회하면서 Index의 값을 변수 v에 할당합니다.

그리고 바로 밑에서 nums[Index] 값에 0으로 채워줍니다. 이 부분은 밑에서 다시 설명하겠습니다.

그 다음 v 값이 0이 아니면 nums배열의 wp 인덱스에 v 값을 할당합니다.

즉, nums배열의 1이 들어 왔을 때 "nums[0] = 1" 이 할당 되는 형태입니다.

  • 첫번째 nums배열의 값은 0이기 때문에 해당 조건에 충족되지 않기 때문

다시 말해 위 로직이 0이 아닌 값들을 nums 배열을 재구성 하는 로직입니다.

그 다음 wp++를 추가시켜 nums 배열의 Index 값을 증강 시켜 줍니다.

  • 추후 들어올 다음 값을 증강된 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] 이라는 결과가 최종적으로 도출 되게 됩니다.

즉, 0이 아닌 요소를 wp 인덱스를 이용해 앞쪽에 재배치하고, wp 뒷부분은 이미 0으로 채워져있기 때문에 최종적으로 0이 배열의 끝으로 이동하게 되는 것입니다.

마치며

  • 생각보다 배열 관련된 문제가 다양한 방식으로 출제되어 고민을 많이 하게되는 문제였던거 같습니다.
    다음에도 좋은 알고리즘 문제가 있다면 꾸준히 포스팅을 진행하겠습니다.

0개의 댓글