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

리아·2021년 2월 6일
0

Algorithm

목록 보기
1/2

프로그래머스 레벨1 다 풀기를 시작했다.
그 첫 문제인 다트게임은 아래와 같다.


문제해석

  1. 먼저 배열을 순회하면서 보너스가 반영된 점수와 배수가 담긴 객체를 새로운 배열에 넣는다.
  2. 배열 순회 중에 옵션인 아차상과 스타상에 대해서 예외처리를 해준다.
  3. 예외처리란 해당 점수와 그 이전 점수에 대한 배수 변화를 말한다.
  4. 1~3의 과정을 거치면 새로운 배열에는 점수와 배수처리가 적용된 배열이 만들어지고
  5. 마지막으로 새로운 배열을 다시 순회하면서 점수와 배수를 더한값을 더해 그 값을 리턴한다.

에러 핸들링

1. 배수를 더해주는 과정에서 *= 2 가 아닌 * 2로 한 점
2. Math.pow 의 인자를 한 개만 넣었던 점
3. 점수가 1 ~ 9까지 있는줄 알았으나 10까지 있었던 (두자리 수)

코드 전문

function solution(dartResult) {
    var answer = 0;
    let arr = dartResult.split('')
    let result = [] 
    
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] === '*') {
            let len = result.length
            if(result[len - 2] !== undefined) {
                result[len - 2].multiple *= 2
                result[len - 1].multiple *= 2
                continue
            }
            else {
                result[len - 1].multiple *= 2
                continue
            }
        }
        if(arr[i] === '#') {
            let len = result.length
            result[len - 1].multiple *= -1
            continue
        }
        if(arr[i] === '1' & arr[i+1] === '0') {
            result.push({ score: Math.pow(10, (arr[i+2] === 'T' ? 3 : arr[i+2] === 'D'? 2 : 1)), multiple: 1})
            i += 2
            continue
        }
        result.push({ score: Math.pow(arr[i], (arr[i+1] === 'T' ? 3 : arr[i+1] === 'D'? 2 : 1)), multiple: 1})
        i++
        continue
    }
    result.forEach(round => {
        answer += round.score * round.multiple
    })
    return answer
}

개선해야 할 점

  1. 원활하게 배수상태를 처리하기 위해서 객체를 사용하였지만 객체없이도 충분히 가능할 것 같다.
  2. 1번에서 연결되는 부분으로 객체 없이 처리하면 마지막에 배열 순회(forEach 문)를 한번 더 하지 않아도 될 것 같다.
  3. 확실한 처리를 위하여 continue를 자주 사용하였는데 이 역시 불필요한 곳에도 쓰인 것 같다.

전부 주관적인 관점에서 회고하며 작성된 내용 입니다.

profile
초보 개발자 블로그

0개의 댓글