본문 바로가기
코딩테스트/코딩테스트 문제

코딩테스트 문제: (LeetCode) Remove Element - 자바스크립트

by 공부가싫다가도좋아 2022. 7. 27.
반응형

포스팅요약 

1. 문제 및 문제 해석

2. 코드


1. 문제

문제보러 가기: https://leetcode.com/problems/remove-element/

출처: https://leetcode.com/ (LeetCode)

 

문제 해석 및 요약

배열 nums와 값 val 이 주어집니다. 주어진 배열에서 val값을 없애주면 됩니다. 

일부 언어에서는 배열의 길이를 바꾸는게 불가능 하므로, val인 값을 제외한 값들을 앞으로 배치시켜 주세요. 또한 배열에서 val값을 뺀 길이 k를 리턴해주세요.

val인 값을 제외한 값들을 앞으로 배치시킬때 순서는 상관이 없습니다.

 

예)

Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,_,_] or nums = [2,2,3,3] or nums = [2,2]
Explanation: 
1) val값 3을 제외한 값을 앞으로 배치 혹은 제거 => [2,2,3,3] or [2,2]
2) val값을 제외한 배열의 길이 4-2 = 2

2. 코드

 //방법 1 순회하며 값 없애기
 for (let i=0;i<nums.length;i++){
        if(nums[i]===val){
            nums.splice(i,1);
            i-=1;
        }else{
            continue;
        }
    }

> 원소가 제거되면 nums.length길이도 하나씩 줄어든다.

> 예를들면 nums= [1,2,2,3] , val = 2

for문을 돌릴때 i = 1일 경우, nums[i]===val이므로 splice로 제거한다. 그러면

[1,2,3] 이 되는데, i-=1을 안해주면 i=2 가 되므로, 값 하나를 놓치게 된다.

 

 

//방법 2 거꾸로 검사 하며 val값 없애기
for (let i=nums.length-1;i>-1;i--){
	if(nums[i]===val){
    	nums.splice(i,1)
    }else{
    	continue;
    }
}

> 똑바로 순회할경우 위와같은 문제가 발생하지만, 현재 코드와 같이 거꾸로 순회하면 상관이 없어진다.

 

//방법 3 val값 뒤로 보내기
let k=0;
    for(let i=0;i<nums.length;i++){
        if(nums[i]===val){
            continue;
        }else{
            if(nums[k]===val){
                nums[k]=nums[i];
                nums[i]=val;
            }else{
                nums[k]=nums[i];
            }
            k++;
        }
    }
    return k;

> 배열에서 val값을 뒤에있는 값들과 교체시켜준다. 

> 마지막에는 val값들이 뒤로 배치되는 형태가 된다. 

반응형

댓글