같은 숫자는 싫어! / filter 메소드
중복을 없엔다? Set이 생각나서 한번 해봤다.
아.. 그럼 뒤에 1도 중복이라서 없어지지?
그럼 일단 arr의 맨 앞 요소를 answer에 넣어두고 shift로 배열에서 제거하고
arr의 맨앞이랑 answer의 맨뒤를 비교해서 같으면 그냥 shift시키고
다르면 다시 answer의 맨 뒤에 넣고 shift하고
이걸 arr의 length가 0이될때까지 반복하면 되겠다!
이렇게 효율성 테스트에서 실패해서 알아보니 shift 가 문제인 것을 알았다.shift를 쓰면 배열의 앞에서 숫자를 빼고
뒤에 있는 숫자를 한칸씩 앞으로 당기는 과정이 있다.
인덱스 2번을 1로, 3번을 2로, 4번을 3으로, 계속 당기는데 만약 그 length가 문제에서처럼 1,000,000이라면? 그래서 효율성 테스트에서 실패했다. 그럼 arr의 앞에서 빼지말고 answer의 뒤에 차곡차곡 쌓는건 괜찮겠지?
for문으로 돌면서 answer의 마지막 요소와 해당 arr의 모든 요소를 비교하는데, 만약 answer의 마지막요소와 arr의 i번째 요소가 다르면
그 i번째 요소를 answer의 마지막에 추가한다.
같으면? 그냥 다시 for문 처음으로 가서 다시 시작한다.
이렇게 하면 효율성 테스트를 통과한다!
위는 다른분이 작성하신 코드이다. filter를 사용하면 훨씬 쉽게 답을 구할 수 있다.
filter는 콜백함수의 조건에 해당하는 모든 요소가 있는 배열을 새로 리턴한다. 이 부분은 map과의 공통점이다.
위에서는 두개의 인자를 받았는데, map과 마찬가지로 총 3개의 인자를 받을 수 있다.
arr.filter((element,index,array)=>console.log(element,index,array), thisArg)
element는 arr의 각 요소값이다. index는 그 요소의 인덱스, array는 지금 사용되는 배열, thisArg는 filter에서 사용될 this값이다.
한번 콘솔에 실제로 찍어서 확인해보자
그렇다면 위의 코드는 이렇게 해석할 수 있다.
arr에서 콜백함수의 조건을 만족하는 요소, 즉 리턴이 true인 애들 을 받아서 새로운 배열을 만든다.
그 콜백함수는 arr의 각 요소값이 그 바로 다음 인덱스의 요소값과 다른 요소만 받아와라.
1,1,3,3,3,0,0,1,1 의 경우 1,3,0,1로 제대로 나온다.