- [JS] for in 문으로 효율성 테스트 실패하기 (프로그래머스)2024년 09월 10일
- 주사위 clice
- 작성자
- 2024.09.10.:36
반응형
아래 문제를 풀다가 처음으로 프로그래머스 효율성 테스트에서 실패를 받았다.
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12906
문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
- arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
- arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
제한사항- 배열 arr의 크기 : 1,000,000 이하의 자연수
- 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
입출력 예
arr answer [1,1,3,3,0,1,1] [1,3,0,1] [4,4,4,3,3] [4,3]
내가 작성한 코드
나는 for 문을 돌려서 지금 검사한 숫자를 temp에 저장해두고, 만약 같으면 answer 배열에 넣지 않도록 무시하고, 다르면(if문) answer 배열에 넣은 뒤 그 값을 새로운 temp값으로 저장하고 이 과정을 반복하기로 했다.
const solution = (arr) =>{ let temp=arr[0]; let answer=[temp]; for(i in arr){ if(arr[i]!=temp){ answer.push(arr[i]); temp=arr[i]; } } return answer; }
그리고 제출 버튼을 눌렀다
for in 문을 사용한 결과
정확성 테스트는 전부 다 통과를 했다
그런데 효율성 테스트에서 실패를 했다.
코드에는 아무 문제가 없어 보이는데 왜 효율성 테스트에서 실패를 한 것일까?
엄청나게 검색한 결과, 내가 순회할 때 사용한 for in 문에서 효율성 문제가 발생 한 것을 찾아냈다
for in 문
내가 작성한 코드에서 'for-in' 반복문을 사용하여 배열 요소를 순회하는 부분에 문제가 발생한 것이다
'for-in' 반복문은 객체의 속성(property)을 순회하기 위해 주로 사용되며, 당연히 배열도 객체의 한 종류이기 때문에 순회가 가능하긴 하지만
배열을 순회할 때에는 그 인덱스를 인덱스 자체가 아니라 문자열로 반환하며 순회한다.
이로 인해 내가 원하는 '인덱스'순회가 아니라 해당 인덱스 밑에 있는 다른 속성까지 순회하느라 더 느려지는 가능성이 생겼고 그로 인해 효율성 테스트 실패가 발생하였다.
따라서 배열을 순회할 때는, 배열의 인덱스를 기반으로 하는 'for' 루프나 'forEach', 'for-of' 같은 메서드를 사용하는 것이 좋다.
이러한 방법을 사용하면 배열의 요소를 정확히 비교하고, 중복되지 않은 요소만을 결과 배열에 추가할 수 있다.
정리하자면
효율성 테스트에서 실패하는 이유는 JavaScript에서 for...in 루프가 배열의 인덱스를 순회하는 데 최적화되어 있지 않고 객체를 순회화는데 최적화 되어있기 때문이었다.
수정된 코드
인덱스만 정확히 순회할 수 있게 for in 문을 일반적인 for 문으로 수정하기만 했다
const solution = (arr) =>{ let temp=null; let answer=[]; for(let i=0; i<arr.length; i++){ if(arr[i]!==temp){ answer.push(arr[i]); temp=arr[i]; } } return answer; }
굿!
훨씬 더 좋은 풀이(최다 좋아요 풀이)
index를 포함하는 풀이가 대부분 더 좋은 효율성이 나오는 듯하다.
function solution(arr) { return arr.filter((val,index) => val != arr[index+1]); }
앞으로는 내가 익숙한 메서드를 사용하지 않고 문제에 알맞는 메서드를 사용하는 습관을 들여야겠다.반응형'프론트 > Javascript Typescript' 카테고리의 다른 글
[JS] 배열에서 Math.max Math.min 구하기 (프로그래머스135808 과일장수) (0) 2024.11.24 자바스크립트 고수도 헷갈리는 배열의 접근 방식 (5) 2024.09.21 자바스크립트 실행 컨텍스트: 예제를 통해 쉽게 이해하기 (1) 2024.08.28 [JS] 자바스크립트 자동 형변환을 이용해서 쉽게 숫자를 문자열로 바꾸기+프로그래머스 12933 (2) 2024.08.02 [JS] 자바스크립트 약수 구하기 (Math.sqrt로 시간 복잡도 줄이기) (0) 2024.08.02 다음글이전글이전 글이 없습니다.댓글