공부/프로그래머스
프로그래머스 레벨 1 같은 숫자는 싫어 자바스크립트 풀이
두둥탁!
2022. 2. 8. 01:17
반응형
■ 문제 설명
배열 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] |
■ 풀이
❌ 틀린 풀이
function solution(arr) {
for(let i=0; i<arr.length; i++) {
if(arr[i] === arr[i+1]) { //arr[i]의 값이 arr[i+1]의 값과 서로 같으면
arr.splice(i, 1); //arr 배열의 i번째부터 1개의 값 삭제(i번째 값 삭제)
i--; //배열이 삭제되면서 뒤에 있던 숫자가 앞으로 당겨오기 때문에 i의 값에 1을 빼줌
}
}
return arr;
}
이렇게 풀었는데 효율성 테스트에서 틀렸다. 왜 틀렸는지 알아보니 배열의 원소를 제거하면 해당 원소의 뒤 원소들을 차례대로 앞으로 당기는 작업을 하는데 배열의 크기가 크면 연산을 많이 하게 된다고 한다.
⭕ 맞는 풀이
function solution(arr) {
const answer = [];
for(let i=0; i<arr.length; i++) {
if(arr[i] !== arr[i+1]) { //arr[i]의 값과 arr[i+1]의 값이 다르면
answer.push(arr[i]); //answer 배열에 arr[i]의 값 삽입
}
}
return answer;
}
반응형