해당 문제는 복잡한 로직은 없지만 여러 조건이 따르는 귀찮은 문제다.
처음엔 if문을 여러개 써서 해결하려 했지만, 코드가 너무 더러운 것 같아서 함수형으로 작성하려고 노력했다.
코드부터 올린다.
const solution = (dart) => {
const pow = {
'S' : 1,
'D' : 2,
'T' : 3
}
const option = {
"#" : -1,
"*" : 2
}
const calc = (char,num) => {
if(/S|D|T/.test(char)) return Math.pow(num,pow[char])
else if(/#|\*/.test(char)) return num * option[char]
else return num
}
const numArr = dart.replace(/[^0-9]/g,'!').split("!").filter(i=>i)
const calArr = dart.replace(/[0-9]/g,'!').split("!").filter(i=>i)
calArr.forEach((i,idx)=> i.includes('*') ||calArr[idx-1] += '*')
return numArr.map((i,idx)=>[...calArr[idx]].reduce((a,b)=>calc(b,a),i)).reduce((a,b)=>a+b)
}
일단 S D T는 각각 1제곱 2제곱 3제곱이기 때문에 바로 치환 가능하도록 오브젝트로 만든다.
옵션인 #,*도 마찬가지.
calc함수는 각 알파벳에 따른 계산을 수행하는 함수.
numArr = 문자열에서 점수만을 추출한 배열
calArr = 문자열에서 알파벳과 *,#을 추출한 배열
숫자를 제외한 calArr에서 *를 이전 점수에 붙여주는 작업을 한다. (조건4)
이제 계산식이 전부 완성되었다.
reduce를 이용하여 숫자를 계산식에 맞춰 점진적으로 계산해나간다.
계산이 완료된 결과물은 또 다시 reduce를 통해 더해주면 끝이 난다.