정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
- "w" : 수에 1을 더한다.
- "s" : 수에 1을 뺀다.
- "d" : 수에 10을 더한다.
- "a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.
주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항
function solution(numLog) {
change = {
'w': 1,
's': -1,
'd': 10,
'a': -10
}
return numLog.reduce((acc, cur, i, arr) => {
if(i === arr.length -1) return acc;
let diff = arr[i+1] - arr[i];
let findKey = Object.keys(change);
cur = findKey.find((key) => change[key] == diff);
return acc += cur;
}, '')
}
하... 0단계 왤케 어려운데... 아니면 내가 어렵게 생가하는거냐...
reduce()
메서드를 사용해보자!!!! arr[i+1] - arr[i]
를 통해 현재 요소와 다음 요소의 차이를 계산한다.Object.keys(changes)
를 통해 객체의 키 배열을 얻어온 후 find()
메서드를 사용하여 차이값과 일치하는 키를 찾는다.acc
)에 추가하여 최종 결과를 반환한다. if(i === arr.length -1) return acc;
를 추하가여 마지막 인덱스에 도달하면 현재까지의 누적값을 그냥 반환시켜버린다. function solution(numLog) {
const convert = {
'1': 'w', '-1': 's', '10': 'd', '-10': 'a'
};
return numLog.slice(1).map((v, i) => {
return convert[v - numLog[i]]
}).join('')
}
slice(1)
메서드를 통해 numLog의 첫 번째 요소를 제외한 나머지 요소들로 새 배열을 만든다. (첫 요소를 기준으로 다음 요소와의 차이를 계산하기 위해서)map()
메서드를 사용하여 v - numLog[i]
로 현재 요소와 이전 요소의 차이를 계산한다.join('')
메서드를 사용해 하나의 문자열로 합친다.const differences = {
'1': 'w',
'-1': 's',
'10': 'd',
'-10': 'a',
};
function solution(numLog) {
return numLog.reduce(
(result, curr, i) => (i === 0 ? result : result + differences[curr - numLog[i - 1]]),
'',
);
}
reduce()
메서드를 사용하여 ! i === 0
, 이 조건으로 첫 번째 요소에서는 result
에 아무것도 추가하지 않는다!!! 오...result
에 누적한다. 세상엔 정말 고수들이 많군여 ^^...