https://school.programmers.co.kr/learn/courses/30/lessons/76501
제출코드
function solution(absolutes, signs) {
return absolutes.reduce((acc, cur, i) => {
signs[i] ? acc = acc + cur : acc = acc - cur
return acc;
},0)
}
문제의 조건을 보았을때, 순회해야하는 배열은 2개이나 길이가 같다고 하였습니다
한개만 순회하면, 나머지는 인덱스로 접근하면 된다는 아이디어를 내었습니다.
코드가 쉬울것이라고 생각해서 최대한 짧게 구현하려고 노력하였습니다.
//1번 풀이
function solution(absolutes, signs) {
let sum = 0;
absolutes.forEach((e, i) => {
if (signs[i]) {
sum += e
} else {
sum -= e
}
})
return sum
}
최초 풀이는 다음과 같습니다. absolutes를 순회하되, 길이가 같으므로 signs의 index로 접근을 하고,
signs의 "값"은 Boolean이기에 분기로 누적하거나 감산하였습니다.
이렇게 해야하나 생각이 들면서 reduce의 가산기 기능을 이용하면 쉬울 것이라 판단하였습니다.
//2번 풀이
function solution(absolutes, signs) {
return absolutes.reduce((acc, cur, i) => {
if (signs[i]) {
acc = acc + cur
} else {
acc = acc - cur
}
return acc;
},0)
}
여기서 분기만, 삼항조건연산자로 변경하여 최종 제출 코드가 되었습니다.
//최종 제출코드
function solution(absolutes, signs) {
return absolutes.reduce((acc, cur, i) => {
signs[i] ? acc = acc + cur : acc = acc - cur
return acc;
},0)
}
아쉬운 점은
array.filter(Boolean)
이 코드를 사용하면 signs의 배열을 true / false로 분기하여 absolutes를 더하고 싶었는데, 구현에 실패하였고
제가 구현하고 싶었던 내용과 가장 비슷한게 위의 코드였던 것 같습니다. filter로 하려고 어려웠는데 수학적 지식을 이용했다면 가능했을 것 같습니다.
음수와 양수를 *1 또는 -1로 표현할 수 있다는 수학적인 지식을 코드에 구현하지 못했습니다.
짧다고 좋은 코드는 아니나, 양식 자체를 변경하여, 함수 선언문 말고 화살표 함수를 사용했으면 한줄로도 표현했을 수 있었습니다.
능동적으로 문제를 변경하고, 수학적 지식이 필요하다는게 포인트였던 문제 였습니다.
'2.알고리즘 > 프로그래머스' 카테고리의 다른 글
[JS]신규 아이디 추천 (0) | 2022.08.24 |
---|---|
[JS]소수 만들기 (0) | 2022.08.19 |
[JS] 프로래머스 숫자 문자열과 영단어 (0) | 2022.08.05 |
빅오 표기법(Big-o Notation) (0) | 2022.04.14 |
[JS] 프로그래머스 K번째 수 (0) | 2021.06.24 |