
LeetCode 27 Remove Element 풀러가기
int 배열 nums에서 val의 값 삭제한다.
int 배열에서 val이 아닌 갯수, k를 리턴하면 된다.
nums의 0번 인덱스부터 k-1번 까지는 nums에서 val을 삭제한 배열을 저장한다. 
nums의 크기나 k-1번 이후의 nums들은 중요하지 않다.
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];
}
문제에서 정답 체크 기준을 보면 sort(nums,0,k)를 해서 비교하기 때문에 상관이 없나보다.
nums의 0번 부터 k-1번에 val이 아닌 값들로 채워야 하니, 맨 뒤 값이 val과 같지 않다면 start 인덱스에 두고, start인덱스를 +1 하여 갱신하는 전략을 짰다.
end인덱스가 val과 같다면 end--를하고, 다르다면 start인덱스 값과 swap을 하고, start++을 하였다.
코드
class Solution {
    public int removeElement(int[] nums, int val) {
        int end = nums.length-1;
        int start = 0;
        int answer = 0;
        while(start<=end){
            if(nums[end] != val){
                int temp = nums[start];
                nums[start] = nums[end];
                nums[end] = temp;
                start++;
                answer++;
            }else end--;
        }
        return answer;
    }
}
결과 : 성공

Runtime

Memory

시간은 괜찮았는데 메모리 효율이 좋지는 못했다. 아마 변수를 많이 써서 인 것 같았다.
메모리를 줄이기 위해서, 변수를 줄이기로 했다.
생각해보니 nums배열의 k번 부터는 중요하지 않다고 했으니, swap할 필요가 없고, 그냥 무조건 앞부분 index부터 채워나가기로 했다.
for문으로 nums을 전체 순회하며 맨 앞부터 val이 아니면 채워넣도록 만들었다.
코드
class Solution {
    public int removeElement(int[] nums, int val) {
        int index = 0;
        int count = 0;
        for(int i=0; i<nums.length; i++){
            if(nums[i]!=val){
                nums[index++]=nums[i];
                count ++;
            }
        }
        return count;
    }
}
결과 : 성공

Runtime

Memory

시간은 그대로이고, 메모리는 0.2MB 정도 줄였다.
지역변수를 줄여서인 듯 했다.
리턴해주는 count 값을 index로 계산할 수 있는 방법을 생각해보았다.
그러다가 이전의 코드에서 결국 index 변수가 nums배열에서 val이 아닌 갯수 임을 깨달았다.
또한, 학부생일 때, index++ 계산이 index = index +1 또는 index+=1보다 효율이 좋지 못하다는 것이 기억나서 코드를 변경해보았다.
코드
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+=1;
            }
        }
        return index;
    }
}
결과 : 성공

Runtime

Memory

메모리가 또 0.2MB 정도 줄었다!
지역변수를 확실히 줄이면서 알고리즘을 짜는 연습을 해야겠다.