hahn

[LeetCode - C] 27. Remove Element 본문

코딩테스트 연습/LeetCode(C - Easy)

[LeetCode - C] 27. Remove Element

hahn 2022. 3. 25. 03:04
728x90
반응형
 

Remove Element - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The relative order of the elements may be changed.

Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the first part of the array nums. More formally, if there are k elements after removing the duplicates, then the first k elements of nums should hold the final result. It does not matter what you leave beyond the first k elements.

Return k after placing the final result in the first k slots of nums.

Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.

Custom Judge:

The judge will test your solution with the following code:

int[] nums = [...]; // Input array
int val = ...; // Value to remove
int[] expectedNums = [...]; // The expected answer with correct length.
                            // It is sorted with no values equaling val.

int k = removeElement(nums, val); // Calls your implementation

assert k == expectedNums.length;
sort(nums, 0, k); // Sort the first k elements of nums
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

If all assertions pass, then your solution will be accepted.

 

Example 1:

Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,_,_]
Explanation: Your function should return k = 2, with the first two elements of nums being 2.
It does not matter what you leave beyond the returned k (hence they are underscores).

Example 2:

Input: nums = [0,1,2,2,3,0,4,2], val = 2
Output: 5, nums = [0,1,4,0,3,_,_,_]
Explanation: Your function should return k = 5, with the first five elements of nums containing 0, 0, 1, 3, and 4.
Note that the five elements can be returned in any order.
It does not matter what you leave beyond the returned k (hence they are underscores).

 

Constraints:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

Solution 1

 

[LeetCode - C] 26. Remove Duplicates from Sorted Array (tistory.com)

 

위 글과 유사하게 풀이했다.

 

다만 달라진 점은 i가 val일 때 val이 아닌 수(j)를 찾아서

 

i에 넣어주고 j에 val을 넣어 중복되는 일이 없게했다.

int removeElement(int* nums, int numsSize, int val)
{
    int i;
    int j;
    
    i = 0;
    if (numsSize == 1)
    {
        if (nums[i] == val)
            return (0);
        else
            return (1);
    }
    while (i < numsSize)
    {
        if (nums[i] == val)
        {
            j = i + 1;
            while (j < numsSize && nums[j] == val)
                j++;
            if (j == numsSize)
                return (i);
            nums[i] = nums[j];
            nums[j] = val;
        }
        i++;
    }
    return (i);
}

Solution 2

(leetcode 제공)

 

나는 nums[]의 값이 val일 경우를 기준으로 했는데

 

이 코드는 != 인 경우를 기준으로 했다.

 

더 깔끔한 것 같다.

public int removeElement(int[] nums, int val)
{
    int i = 0;
    for (int j = 0; j < nums.length; j++)
    {
        if (nums[j] != val)
        {
            nums[i] = nums[j];
            i++;
        }
    }
    return i;
}

Solution 3

(leetcode 제공)

 

i가 val일 경우 뒤(n)에서 부터 하나씩 i에 넣어주는 방식이다.

 

n이 val이더라도 val이 아닐 때까지 계속 치환을 해주니 결국은

 

배열에서 val의 값은 모두 사라진다.

public int removeElement(int[] nums, int val)
{
    int i = 0;
    int n = nums.length;
    while (i < n)
    {
        if (nums[i] == val)
        {
            nums[i] = nums[n - 1];
            n--;
        } else
        {
            i++;
        }
    }
    return n;
}

총평

보면 solution 1,2와 solution 3의 결괏값이 다르다.

 

문제에서 element의 순서는 상관없다고 명시되어 있다.

 

전에 문제랑 비슷해서 쉬웠다.

 

그리고 norm때문에 for문을 안 쓰다보니

 

for문 쓰는걸 계속 까먹는다..

728x90
반응형