https://school.programmers.co.kr/learn/courses/30/lessons/12910
이 문제는 filter / reduce / map 다 사용할 수 있다고 판단했다
for문도 사용해도 된다.
reduce를 더 연습하기 위해 reduce로 풀어봤다.
나의 풀이
function solution(arr, divisor) {
const result = arr.reduce((acc,cur) =>{
cur % divisor === 0 ? acc.push(cur) : null;
return acc;
},[])
return result.length === 0 ? [-1] : result.sort((a,b) => a - b) ;
}
실패한 코드
function solution(arr, divisor) {
const result = arr.reduce((acc,cur) =>{
cur % divisor === 0 ? acc.push(cur) : null;
return acc.length !== 0 ? acc.sort((a,b)=> a - b) :[-1];
},[])
return result;
}
왜 .. 무엇때문에 실패하는거지....
(+추가)
알아냈다.
그렇다면 왜 오류가 났을까?
return 직전에 console.log를 해줬다.
return에서 -1을 받아온 것이다.
나는 단순히 reduce로 모든 작업이 끝나고 return이 되는 줄 알았는데 아니었다.
일단 reduce 구문에 대해서 잘 알고 있어야 한다.
일단 reduce는 콜백 함수이다. 즉 여기서 설정한 누산기 (acc)는 return값을 받아서 계속 저장하고 누적하고를 반복한다.
따라서 reduce로 arr의 배열을 순서대로 돌면서 계속 return값을 저장하고 누적하고 하다가
한 바퀴를 돌면 그때 누적 계산의 결과값을 return하는 것이 바로 reduce이다.
단 처음에만 값이 없으니 그것이 initialValue
나는 [ ] 빈 arr로 설정을 해놓았다.
한 마디로 arr를 다 돌때까지의 모든 return 값을 누적 계산한 결과를 return한다.
여기 보면 계속 console.log 바로 다음이 return이기에 [4,2]다음 return이 누적되니까 [2,4,8]로 2,4가 정렬된 것이 보인다.
그리고 마지막도 정렬이 되고 return이 된다. 여기서는 return전에 console.log를 하니까 마지막꺼는 안된 것 처럼보이는 것이다.
즉 return이 계속 누산되고 있던 것이다.
그렇기 때문에 위의 코드가 오류가 난것이다.
이렇게 -1이 처음 할당되면 그 뒤에도 나눠지는 것이 없으면 상관이 없는데
-1이 할당되고나서 딱 나누어 지는 값이 나오면 그 값이 처음 조건에 의해 push되어져서
-1과 나누어지는 값이 공존하게 되는 것이다.
코드 오류를 수정한 풀이
function solution(arr, divisor) {
const result = arr.reduce((acc,cur,i, ars) =>{
cur % divisor === 0 ? acc.push(cur) : null;
if(ars.length === (i + 1)){
return acc.length !== 0 ? acc.sort((a,b)=> a - b) :[-1];
}
return acc
},[])
return result;
}
이게 정답은 아니고 제가 이것저것 고민하고 시도해보다 해결한 코드입니다.
if문에서 arr 배열의 마지막 요소를 돌때 return의 조건만 변경하고
나머지 return을 그대로 뒀습니다.
이렇게 하면 배열의 마지막 요소 전까지는 나누어 떨어지면 acc 배열안에 추가가되고 안되면 null이니까 pass되고
return 은 acc이기에 계속 누산이 되는 겁니다.
여기서 return acc 를 해줘야 오류가 나지 않습니다.
reduce는 return 값이 있어야합니다. 그래야 그 값을 누산하면서 함수가 작동하기 때문입니다.
에로우 함수를 하고 중괄호를 하면 return을 넣어줘야하고 중괄호로 하지 않으면 자바스크립트엔진이 암묵적인 return을 문맥상으로 파악하기에 생략이 가능합니다. (물론 연산가능한 값이어야 합니다. )
다른 사람 풀이
function solution(arr, divisor) {
var answer = arr.filter(v => v%divisor == 0);
return answer.length == 0 ? [-1] : answer.sort((a,b) => a-b);
}
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level.1 소수찾기 <에라토스테네스의 체>, <Array.from()>, <Array.prototype.fill()> (0) | 2022.08.02 |
---|---|
[프로그래머스-JS] level.1 두 정수 사이의 합 (0) | 2022.07.28 |
[프로그래머스-JS] level.1 같은 숫자는 싫어 (0) | 2022.07.26 |
[프로그래머스-JS] [카카오][1차] 다크게임 <문자열 처리> (0) | 2022.07.26 |
[프로그래머스-JS]level.1 가운데 글자 가져오기 (0) | 2022.07.23 |