[ココ初]ダーツゲーム(プログラマー)


問題の説明

  • 合計3回の機会
  • チャンスごとに0点から10点の
  • を獲得する
  • 分、単(S)、双(D)、三(T)領域
  • 各分野の当選点数は1平方、2平方、3平方で
  • を計算する.
  • オプション、スター賞(*)、雅察賞(#)は
  • 存在
  • スター賞はこの点数の2倍で、前に獲得した点数はこの点数の-1倍
  • だった.
  • スター賞も1回目のチャンスで受賞できるが、この場合、1回目のスター賞の点数だけで2倍の
  • に達することができる.
  • スター賞は他のスター賞、サブ賞、効果
  • を重ねることができます.
  • S、D、Tは1分ごとに
  • が存在する.
  • スター賞、アチャ賞は一つしかなく、存在しないかもしれません.
  • に答える

    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.スター賞条件...)