[프로그래머스] 다트 게임 - 해설

hoonsbory·2022년 12월 28일
0
링크 https://school.programmers.co.kr/learn/courses/30/lessons/17682

해당 문제는 복잡한 로직은 없지만 여러 조건이 따르는 귀찮은 문제다.

처음엔 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를 통해 더해주면 끝이 난다.

0개의 댓글