ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] [1차] 다트 게임
    알고리즘 2024. 2. 13. 18:09

    ❓문제 설명

    • 다트게임을 할것임 3번을 던져서 보너스도 있고 감점하게 만드는 요소도 있음
    • 게다가 다트가 박히는 구역별로 제곱값 또는 세제곱값을 주는 요소도 있음
    • 그래서 대충 "1D2S#10S" 이런식으로 문자열이 나오는데 이걸 점수로 바꿔놓아야함
    • 부가적은 조건은 문제에 보면 있음 그거 보면서 풀어보셈

     

    ✅ 문제 해결

    • 예외에 대한 처리를 해야하는데 어디서부터 해야할지 막막했음.
    • *이게 연산을 개떡같이 하니깐 이거부터 처리할까하다가 반복문을 돌리게 되면 문자 하나씩 들어갈텐데 10이라는 숫자가 눈에 띄었음 그래서 이거 먼저 처리하고 나머지 값에 대해서 처리를 해야할 것 같음
    • 이후에는 반복문을 돌았을 때 어떠한 값을 return해주면 되는데 이럴 때에는 break를 쓰는게 좋을 것 같아 switch를 사용해보겠음
    • 먼저 숫자에 대한 처리를 하고 이후에 문자에 대해서 index값을 가지고 처리를 해보겠음
    function solution(dartResult) {
        const state = { star:'*', oops:'#', Single:'S', Double:'D', Triple:'T'};
        let score = 0, scores = []
        for (let i= 0; i < dartResult.length; ++i) {
            if (!isNaN(dartResult[i])) {
                score = +dartResult[i-1]  === 1 ? 10 : +dartResult[i]
            } else {
                switch(dartResult[i]) {
                    case state.Single:
                        scores.push(score)
                        break;
                    case state.Double:
                        scores.push(score ** 2)
                        break;
                    case state.Triple:
                        scores.push(score ** 3)
                        break;
                    case state.star:
                        if (scores.length -2 >= 0) {
                            scores[scores.length -2] *= 2
                        }
                        scores[scores.length - 1] *= 2;
                        break;
                    case state.oops:
                        scores[scores.length - 1] *= -1
                        break;
                }
            }
        }
        return scores.reduce((a, b)=> a += b)
    }

     

     

    ❕느낀점

    • 문자에 +를 앞에 붙였을 때 숫자로 변환된다면 타입값을 간단히 바꿀 수 있고 이를 통해 문자인지 숫자인지 확인할 수 있음 +'9' == 9 숫자로 변환하지 못하는 값은 NaN을 반환함 근데 이걸 그대로 조건문에 넣으면 0이 false값으로 되기에 주의해야 함
    • 반복문을 돌리면서 예외처리에 대해서 각각 다르게 처리를 해야하는 경우 길이가 다른 것부터 처리를 하는 것이 좋다.
    • Math.pow(a, 2) 이렇게 사용하나 a**2이렇게 사용하나 성능 상 차이는 없다고 한다
    • reduce를 사용할 때 reduce((a, b)=> a + b, 0) 이렇게 하나 위에처럼 하나 같은 결과가 나온다 

    댓글

Designed by Tistory.