정확도 테스트 딱 하나가 통과되지 않았다. (시간 초과)
고민을 하다가 검사를 할 필요가 없는 부분은 continue로 건너뛰어보자 생각했다.
function solution(arr) {
let answer = [];
for (let i = 0; i < arr.length; i++) {
if (!answer.includes(arr[i]) || arr[i] !== arr[i-1]) answer.push(arr[i]);
}
return answer;
}
연산을 하나라도 덜 하기 위해 answer에 무조건 들어가게 되는 arr의 0번째 값을 미리 추가하고 for문을 (0번째가 아닌) 1번째부터 돌렸다.
무조건 연속되는 숫자 중 첫 번째 숫자만 넣을 것이므로 뒤에 나온 숫자가 앞 숫자와 같다면 answer에 포함되어 있는지 비교할 필요가 없으니 continue를 통해 다음 for문으로 건너뛰었다.
검사할 필요가 있는 숫자만 if문으로 검사하여 answer에 추가했더니 정확도 테스트를 모두 통과할 수 있었다.
function solution(arr) {
let answer = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] === arr[i-1]) continue;
if (!answer.includes(arr[i]) || arr[i] !== arr[i-1]) answer.push(arr[i]);
}
return answer;
}
맨 뒤의 값과 비교하는 방법은 .at(-1)을 쓰니 처음 풀이와 같이 정확도 테스트 하나에서 실패가 떴다. 원래 기존에 많이 쓰는 방법인 arr[arr.length - 1]로 고쳤더니 오히려 테스트를 모두 통과했다 🙄
.at()이 새로 등장한 자바스크립트 문법으로 알고 있는데 시간 효율성에서 더 떨어지다니 궁금해서 조사해봤다.
참고: Array.prototype.at() MDN 자료
가장 공식적인 MDN을 보니 'array.at()이 array[array.length - 1]보다 더 간단하다'고만 나와 있었다. 하지만 시간 테스트에서 밀리는 걸 😂
게다가 array.at()은 브라우저별 호환성 문제도 있다고 한다.
그냥 맘편하게 array[array.length - 1]를 쓰면 되겠다 😄
** 이건 추측인데 array.at()이 array[array.length - 1]를 더 사용하기 쉽도록 '추상화'한 거라서 더 간단한 형태를 연산하는 과정에서 시간이 더 드는 게 아닌가 싶었다. (마치 깃허브가 다른 프레임워크 없이 바닐라 자바스크립트로 만들어진 것처럼) 하지만 추측일 뿐이다 😉
filter 풀이로도 다시 풀어보았다.
function solution(arr) {
return arr.filter((val, idx) => val !== arr[idx + 1]);
}
filter는 새로운 배열을 반환하기 때문에 위 아래 answer = []와 return answer가 필요 없어졌다.
idx + 1을 하면 배열의 마지막 값에서 undefined와 비교하게 되는데 댓글을 보니 이 부분에서 딱히 에러가 나지는 않는 것 같다. (실제 코드 테스트에서도 모두 통과)
for문은 사실 map이나 filter로 얼마든지 바꿀 수 있다. 다음에 풀 때는 for문 대신 이런 고차함수들을 써봐야겠다.