본문 바로가기

LeetCode

[LeetCode] - 27. Remove Element

LeetCode는 프로그래밍 문제를 풀며 코딩 실력을 향상할 수 있는 온라인 플랫폼입니다. 다양한 알고리즘 및 데이터 구조 문제를 제공하며, 면접 대비에 유용합니다. 해당 문제는, LeetCode Problems에서 볼 수 있는 난이도 '쉬움 (Easy)' 단계인 "Remove Element" 문제입니다.

--> https://leetcode.com/problems/remove-element/description/

 

문제 : 

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place.

The order of the elements may be changed. Then return the number of elements in nums which are not equal to val. Consider the number of elements in nums which are not equal to val be k, to get accepted, you need to do the following things :

  • Change the array nums such that the first k elements of nums contain the elements which are not equal to val. The remaining elements of nums are not important as well as the size of nums.
  • Return k.

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

이 문제는 주어진 정수 배열 nums와 정수 val이 있을 때, nums에서 val의 모든 발생을 제자리에서 제거한 후, 요소들의 순서는 변경될 수 있다는 것을 인지한 하에 val과 같지 않은 요소들의 개수를 반환하는 코드를 짜는 것입니다.

 

1. ArrayList를 이용한 코드 : 

class Solution {
    public int removeElement(int[] nums, int val) {
        List<Integer> newNums = new ArrayList<>();
        
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                newNums.add(nums[i]);
            }
        }

        for (int i = 0; i < newNums.size(); i++) {
            nums[i] = newNums.get(i);
        }

        return newNums.size();
    }
}

 

우선 저는, 새로운 ArrayList를 만든 후, 거기에 val이 아닌 nums의 요소들을 다 추가한 후에, nums를 다시 val이 없는 배열로 만들고, 마지막에는 newNums (ArrayList)의 크기를 리턴하는 코드를 구현해 봤습니다. 후에 다른 유저들의 솔루션들도 봤는데요, 굳이 ArrayList를 안 쓰고도 구현되는 더 나은 코드가 있더라고요, 바로 참고해서 써보겠습니다.


2. 모범답안 :

class Solution {
    public int removeElement(int[] nums, int val) {
        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != val) {
                nums[index] = nums[i];
                index++;
            }
        }
        return index;
    }
}
// rahulvarma5297 유저의 코드

1,2 순서대로의 코드 Runtime 결과