오늘도 개발

4. Remove Element 본문

자료구조 & 알고리즘/Leetcode

4. Remove Element

Sueeeeeee 2022. 5. 17. 13:03

문제

입력된 배열 nums 에서 값이 val인 요소 모두 삭제. 

삭제 후 남은 요소는 빈 칸 없이 앞에서부터 접근할 수 있어야 함.

삭제 후 남은 요소의 개수 k 반환할 것.

 

내가 생각한 방식 

앞에서부터 i로 검색, 뒤에서부터 j로 검색. 

둘 다 val이 아닌 경우 nums[i]와 nums[j] 교체.

=> 인풋이 [1], 1인 경우 런타임 에러 발생. 

int removeElement(int* nums, int numsSize, int val){
    int k = 0;
    int j = numsSize - 1;
    int i = 0;

    while (i < numsSize && j >= 0){
        if (nums[i] != val){
            k++;
            i++;
        }
        else {
        	// [1], 1인 경우 j가 while문이 끝난 후 -1이 됨
            // nums[-1]에 접근해야 하므로 오류 발생
            while(nums[j] == val){
                j--;
            }
            nums[i] = nums[j];
            i++;
            j--;
        }
    }
    return k;
}

 

해결책

i, j 모두 0부터 검사.

i는 모든 요소를 검사하는 포인터,

j는 nums[i]가 val인 경우를 찾는 포인터.

 

nums[i]가 val인 경우 j는 그대로 두고 i만 앞으로 이동. 

nums[i]가 val이 아닌 경우 nums[i], nums[j] 교체 후 j, i 둘 다 앞으로 이동.

http://yucoding.blogspot.com/2013/03/leetcode-question-81-remove-element.html

int removeElement(int* nums, int numsSize, int val){
   int i = 0; 
   int j = 0;

   while(i < numsSize){
       if (nums[i] != val){
           nums[j] = nums[i];
           j++;
       }
       i++;
   }
   return j;
}

 

'자료구조 & 알고리즘 > Leetcode' 카테고리의 다른 글

6. Check If N and Its Double Exist  (0) 2022.05.19
5. Remove Duplicates from Sorted Array  (0) 2022.05.18
3. Merge Sorted Array  (0) 2022.05.16
2. duplicate Zeros  (0) 2022.05.14
1. Find Numbers with Even Number of Digits  (0) 2022.05.06