최근 월간 코드챌린지, 카카오 인턴 등 기출 문제들을 주로 풀었다.
근데 스택/큐를 사용하는 문제에서 유독 애를 먹는 내 모습을 발견했다.
그래서 프로그래머스 고득점 kit을 유형별로 하나씩 풀고있는데,
이 문제를 풀고나서 다른 사람의 풀이도 보니 신기한 점들이 있어서,
추후에 내가 볼 수 있도록 포스팅 해두기로 했다.
메모리: 93.8 MB, 시간: 32.39 ms
코딩테스트 연습 > 스택/큐
정확성: 71.9
효율성: 28.1
합계: 100.0 / 100.0
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
| arr | answer |
|---|---|
| [1,1,3,3,0,1,1] | [1,3,0,1] |
| [4,4,4,3,3] | [4,3] |
입출력 예 #1,2
문제의 예시와 같습니다.
function solution(arr)
{
var answer = [];
var stack=[];
for (var element of arr )
{
if(stack.length === 0)
{
answer.push(element);
stack.push(element);
}
else
{
if(stack[0] === element) continue;
else
{
stack.pop()
stack.push(element)
answer.push(element)
}
}
}
return answer;
}
이게 첫 제출코드인데, 아래와 같은 생각을 하며 풀이했다.
아무튼, 정답이긴 했다. 근데 다른 풀이들이 궁금해서 좀 찾아봤는데
filter()를 활용하는게 모범 답안인듯 하더라.
어떻게 하냐면..
function solution(arr)
{
var answer =[];
answer = arr.filter((val,index) => val != arr[index+1]);
return answer;
❓
더 줄이면..
function solution(arr)
{
return arr.filter((val,index) => val != arr[index+1]);
}
??????????
일단, filter는 정한 조건에 대해서 참이면 이를 return하고,
조건을 충족하지 못하는 경우에는 버려버린다.
filter의 파라미터로 해당 배열의 값 뿐만 아니라 index도 사용할 수 있다.
필터의 존재에 대해서 알았지만, 마땅한 방법이 떠오르지 않아서
아까 맨 위 코드처럼 풀이한 것인데.. index 를 활용하면 저렇게 쉽게 풀수있다..!
입력값인 arr를 val로 순회하며, val이 arr[index+1](즉, 다음 value) 와 다른 경우에만 반환하는 것이다.
사실 어려운 문제도 아니고 풀이가 복잡하거나 조건이 까다롭지도 않았지만,
아는 만큼 더 효율적으로 코드를 작성할 수 있겠다 싶어서 포스팅했다.
오늘도 하나 배워간다.