본문 바로가기

알고리즘구현능력/문제해결능력

[javascript] 프로그래머스/1차 다트게임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//점수 계산
// 1. 다트게임은 총 세번의 기회로 구성되어 있음.
// 2, 각 기회마다 얻을 수 있는 점수는 0점에서 1점까지이다.
// Single(s) Double(D) Triple(T) 1제곱, 2제곱, 3제곱 점수^1 점수^2 점수^3
// 옵션으로 스타상(*) 아차상(#) 스타상 당첨시 점수 바로전에 얻을 점수를 2배로 한다
// 스타상 *의 효과는 다른 스타상 *의 효과와 중첩가능 4배가 된다.
// 아차상의 효과는 마이너스 
// 스타상과 아차상 효과 중첩이 가능하다 -2배가 될수 있음.
// Singe, Doulbe, Triple 점수마다 하나씩 존재한다.
// 스타상 아차상 점수마다 둘 중 하나만 존재할 수 있음 존재하지 않을수도 있다.
//0~10의 정수와 문자 S,D,T,*,#으로 구성된 문자열이 입력될시 총 점수를 반환하는 함수를 작성하라...
 
function solution(dartResult) {
    let answer = [];  //점수/보너스/옵션
    let count= 0;
    for(let i=0;i<dartResult.length;i++){
       let object = {};
        //점수
        if(!isNaN(dartResult[i])&&!isNaN(dartResult[i+1])&&Number(dartResult[i])<=9&&Number(dartResult[i+1])<=9){
            //두자리수 10밖에없음
            object.score = 10;
            i += 2;
        }
        else if(Number(dartResult[i])<=9){
            object.score = Number(dartResult[i]);
            i += 1;
        }
        //보너스
        object.bonus = dartResult[i];  
        //옵션
        if(dartResult[i+1]==="*"||dartResult[i+1]==="#"){
            i+=1;
            object.option = dartResult[i];
            answer.push(object);
        }
        else{
            answer.push(object);
        }
    }
    //아차상 점수는 해당 점수만 -1곱하고 스타상은 해당점수와 바로 전에 얻는 점수에 해당된다.
    let sum = [];
    for(let i=0;i<answer.length;i++){
        let num  = Number(answer[i].score);
        //보너스 체크
        if(answer[i].bonus==="S"){
            
        }
        else if(answer[i].bonus==="D"){
            num = Math.pow(num,2);
        }
        else if(answer[i].bonus==="T"){
            num = Math.pow(num,3);
        }
        //옵션체크
        if(i===0&&answer[i].option==="*"){ //처음에 있을떄..
            num *= 2;
            sum.push(num);
        }
        else if(answer[i].option==="*"){
            sum[sum.length-1*= 2//바로 전에 얻음 점수를 두배..
            num *= 2;
            sum.push(num);
        }
        else if(answer[i].option==="#"){ //아차상일떄..
            num *= -1;
            sum.push(num);
        }
        else{
            sum.push(num);
        }
    }
    return sum.reduce((acc,cur)=>acc+cur);
}
cs

새롭게 알게된점

1. 알고리즘 문제풀이시에 나오는 입력값들을 원하는 결과에 나오기 쉽게 하도록 형식을 좋게 바꾸는 것이 중요하다.

문자열로 된 형식을 score bonus option 세가지 분류의 객체로 넣어서 정리했다.