[LeetCode] Algorithm/Move Zeroes/LeetCode 283

JIEUN YANG·2022년 10월 4일
0

주어진 배열에서 0이 아닌 엘리먼트들의 순서는 유지한 채, 0만 맨 끝으로 이동시키는 문제.

복사본 없이 풀이해야 하며, 동작 시간은 최소화 하는 방향으로 완성할 것.


for loop 이용

let moveZeroes = function(nums) {
    for(let i = nums.length-1; i >= 0; i--){
        if(nums[i]===0){
            nums.splice(i,1)
            nums.push(0)
        }
    }
    return nums
};
  • nums 배열을 차례로 탐색하여 인덱스의 엘리먼트가 0이라면 해당 요소를 splice(삭제)하고 nums 요소에 0을 붙이는 방식.
  • for loop를 순회를 배열의 맨 뒤부터 진행하는 이유는 0이 연속으로 두번 주어지는 배열의 형태에서 예외가 존재하기 때문이다.
  • splice는 초기 인덱스에 매핑되었던 엘리먼트의 변형을 가져오기 때문에 for loop 순회는 배열 인덱스의 맨 마지막부터 실행해야 한다.

예시

let moveZeroes = function([0,0,3,4,7]) {
    for(let i = 0; i <nums.length; i++){
        if(nums[i]===0){
            nums.splice(i,1)
            nums.push(0)
        }
    }
    return nums
};

1) i가 0일 때, if문 진입.
	[0,0,3,4,7].splice(0,1) // [0,3,4,7]
    [0,3,4,7].push(0) // [0,3,4,7,0]

2) i가 1일 때, if문 통과 후 그대로 return
	// [0,3,4,7,0]

비교

let moveZeroes = function([0,0,3,4,7]) {
    for(let i = nums.length-1; i <=0; i--){
        if(nums[i]===0){
            nums.splice(i,1)
            nums.push(0)
        }
    }
    return nums
};

1) i가 4일 때, if문 진입.
	[0,0,3,4,7].splice(4,1) // [0,3,4,7]
    [0,3,4,7].push(0) // [0,3,4,7,0]

2) i가 3일 때, if문 통과 // [0,3,4,7,0]
3) i가 2일 때, if문 통과 // [0,3,4,7,0]
4) i가 1일 때, if문 통과 // [0,3,4,7,0]
5) i가 0일 때, if문 진입
	[0,3,4,7,0].splice(0,1) // [3,4,7,0]
    [3,4,7,0].push(0) // [3,4,7,0,0]


투포인터 이용

투포인터 알고리즘은 1차원 배열 내에서, 각각 다른 원소를 가리키는 2개의 포인터를 두고 이를 이동하면서 답을 도출하는 방식이다.

profile
violet's development note

0개의 댓글