<문제 설명>
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
"w" : n이 1 커집니다.
"s" : n이 1 작아집니다.
"d" : n이 10 커집니다.
"a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
<나의 풀이>
function solution(n, control) {
var answer = n
for (i of control) {
if (i == 'w') answer += 1
if (i == 's') answer -= 1
if (i == 'd') answer += 10
if (i == 'a') answer -= 10
}
return answer
}
<다른사람의 풀이>
const operations = {
w: (n) => n + 1,
s: (n) => n - 1,
d: (n) => n + 10,
a: (n) => n - 10,
}
function solution(n, control) {
;[...control].reduce((prev, op) => {
console.log(prev)
operations[op](prev)
}, n)
return n
}
solution(0,"wsdaa")
위 코드를 설명하자면,
1. operations 라는 배열에 오는 문자의 경우에 따라 필요한 계산을 키,벨류 형태로 선언해 놓는다
2. control에 들어오는 문자열을 전개구문을 활용해 문자로 나눠준다. ('abc' -> a b c 이런 느낌)
3. 위 값에 reduce 함수를 넣어 연산을 시작하는데 prev = 누적된 값, op = (operations 에서 가져온) 현재값을 의미한다.
4. 그리고 n은 누산을 시작하는 초기값을 의미한다.
위의 코드의 실행 내용은,
0. 초기값 n이 0으로 시작하며 prev(누산기) 배열순회 start!
1. 0+w -> w는 n+1 이니까 0+1 은 1 -> 1이 누산값이 됨.
2. 1+s -> s는 n-1 이니까 1-1 은 0 -> 0이 누산값이 됨.
3. 0+d -> d는 n+10 이니까 0+10 은 10 -> 10이 누산값이 됨.
.
.
이런 식으로 다 돌면 뒤에 a가 두 번 오므로 -10을 두번 하면 결과값은 -10으로 잘 나온다.
<reduce함수의 쓰임, 장점>
reduce 함수는 배열을 순회하면서 앞의 값에 대해 계속 값을 누산(누적해서 계산)하는 경우 유용하다고 한다.
이런 경우 다른 배열 함수에 비해 더 깔끔하게 코드를 작성할 수 있는 장점이 있다.
<reduce 함수 사용법 설명한 mdn 문서 내용>
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
--아래는 간략한 예제
Array.prototype.reduce()
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
const array1 = [1, 2, 3, 4];
// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce((accumulator, currentValue) => accumulator + currentValue, initialValue);
console.log(sumWithInitial);
// Expected output: 10
다른 사람의 코드가 흥미로우면서도 reduce 함수에 대해 다 이해를 못해서 알아봤다. 해당 함수가 이해하기 어려운 사람들에게도 도움이 되면 좋겠다.
멋져요