-
[알고리즘/자바스크립트] 배열의 특정요소만 맨 뒤로 옮기기 (Moving Zeros To The End)Algorithm 2019. 2. 24. 14:25
-해당 문제는 codewars사이트의 level5 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-
[문제] Write an algorithm that takes an array and moves all of the zeros to the end, preserving the order of the other elements.
moveZeros([false,1,0,1,2,0,1,3,"a"]) // returns[false,1,1,2,1,3,"a",0,0]
[해석] 배열에 있는 모든 0을 맨 뒤로 옮기되, 다른 요소들의 위치는 변경시키면 안된다.
레벨5 라고는 하지만 내 생각엔 레벨6~7 정도 되는 쉬운 문제인 것 같다.
배열에서 0만 맨 뒤로 옮겨서 출력하는 문제!
var moveZeros = function (arr) { return arr.sort((l, r) => { if(l === 0) return 1 else return -1 }) }
먼저 생각한 답은 sort()함수를 이용하는 거였는데
이건 틀린 풀이였다.
첨에는 l이 0일때 l과 r의 순서를 바꾸는 식으로 맨 오른쪽으로 보낼 수 있지 않을까 생각했는데
순서를 바꾸는 과정에서 잘못된 결과가 나왔다.
var moveZeros = function (arr) { var lastI = arr.lastIndexOf(0); while(lastI > -1) { arr.splice(lastI, 1) arr.push(0) lastI = arr.lastIndexOf(0, lastI-1); } return arr }
그래서 생각한 답은 0의 index를 뒤에서부터 구해서
-1이 나올때까지 배열 뒤에 0을 추가해주는거.
이 풀이로 테스트는 통과했는데 다른 사람들 풀이를 대충 살펴보니
filter()와 concat()를 이용해서 정말 간단하게 푼 해답이 있었다!
var moveZeros = function (arr) { return arr.filter((x) => x !== 0).concat(arr.filter((x) => x === 0)) }
너무나도 심플하고 간단하다!
filter() 함수는 첫번째 인자에 어떤 조건식을 세우면
그 조건식에 해당하는 요소들로 새로운 배열을 만들어서 반환한다.
즉 x라는 인자에 x !== 0 이라는 조건식을 세웠으므로
0이 아닌 요소들만 가져와서 새로운 배열을 만들어 return한다.
두번째 filter()로는 x 인자가 0인 요소들로만 배열을 만든다.
그리고 concat()함수로 두 배열을 합쳐서 return한다.!
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 배열에 요소 추가하고 합치기 (Create Phone Number) (0) 2019.02.24 [알고리즘/자바스크립트] 두 객체를 비교하여 케이크 만들 수 있는 최대 횟수 구하기 (Pete, the baker) (0) 2019.02.24 [알고리즘/자바스크립트] 어떤 값의 개수가 홀수인지 판별하기 (Find the odd int) (0) 2019.02.24 [알고리즘/자바스크립트] 트리보나치 수열 구하기 (Tribonacci Sequence) (0) 2019.02.20 [알고리즘/자바스크립트] 홀수 짝수 판별하여 map()으로 배열 재구성하기 (WeIrD StRiNg CaSe) (0) 2019.02.19 COMMENT