[카카오1차] 다트 게임(프로그래머스)

정승옥(seungok)·2020년 12월 10일
0

프로그래머스

목록 보기
20/40
post-thumbnail

문제설명

  • 총 3번의 기회로 구성
  • 각 기회마다 0점에서 10점까지 얻음
  • 점수와 함께 Single(S), Double(D), Triple(T) 영역 존재
  • 각 영역 당첨시 점수에 1제곱, 2제곱, 3제곱으로 계산
  • 옵션으로 스타상( * ), 아차상( # ) 존재
  • 스타상은 해당 점수와 바로 전에 얻은 점수를 2배, 아차상은 해당 점수에 -1배
  • 스타상은 첫번째 기회에서도 나올수 있고 이 경우 첫번째 스타상의 점수만 2배
  • 스타상은 다른 스타상, 아차상과 효과 중첩 가능
  • S, D, T는 점수마다 하나씩 존재
  • 스타상, 아차상은 둘 중 하나만 존재하며 존재하지 않을 수도 있음

풀이

function solution(dartResult) {
    // 각 영역 점수들을 담을 answer, 각 영역 점수이자 마지막 총합계산 sum
    // 입력된 문자열 dartResult를 배열로 변환
    let sum;
    let answer = [];
    const dartResultArr = dartResult.split('');
    dartResultArr.map((point,idx)=>{
        // 0~9일 경우와 10일 경우를 나눠 처리
        // 문자열의 현재 인덱스와 다음 인덱스 위치 문자가 '1','0'일때 10
        // 문자열의 현재 인덱스 바로 전 인덱스 위치 문자가 '1'이 아니면 0~9
        // idx > 0일때 회차가 바뀜을 의미하므로 
        // 현재 sum을 answer에 담고 변경 회차 점수가 sum이 된다
        // 그 외는 첫번째 회차이므로 현재 회차 점수가 sum이 된다
        if(dartResultArr[idx] === '1' && dartResultArr[idx+1] === '0'){
            if(idx>0){
                answer.push(sum);
                sum = 10;
            }else{
                sum = 10;
            }
        }else if(point.charCodeAt()>=48 && point.charCodeAt()<=57){
            if(dartResultArr[idx-1] !== '1'){
                if(idx>0){
                    answer.push(sum);
                    sum = Number(point);
                }else{
                    sum = Number(point);
                }      
            }
        }
        // S, D, T, #, * 각각 경우 점수 적용
        // idx가 2또는 3일때(첫 회차에 나올경우) 해당 점수만 2배
        // 그 외는 해당 점수와 이전 회차 점수 2배
        if(point === 'S')
            sum *= 1;
        else if(point === 'D')
            sum **= 2;
        else if(point === 'T')
            sum **= 3;
        else if(point === '#')
            sum *= -1;
        else if(point === '*'){
            if(idx===2||idx===3){
                sum *= 2;
            }else{
                answer[answer.length-1] *= 2;
                sum *= 2;
            }
        }
        // 문자열의 끝이면 마지막 회차 점수 계산이 완료됐으므로 answer에 추가
        if(idx === dartResult.length-1){
            answer.push(sum);
        }
    })
    // 총 점수 계산을 위해 sum을 0으로 초기화
    sum = 0;
    // 배열 answer의 각 원소를 돌며 sum에 더해 총합을 계산하고 최종 sum값 리턴
    answer.map(num=>sum +=num);
    return sum;
}

체크포인트

  • 0~9인 경우와 10일때 경우를 나눠 문제해결하는 방법을 찾기
  • 문제설명을 제대로 읽고 헛수고(?) 줄이기(ex. 스타상 조건...)
profile
Front-End Developer 😁

0개의 댓글