본문 바로가기
[개발] 코딩테스트/프로그래머스

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

by hmmmm_ 2022. 5. 5.

[문제 바로가기] 

2018 KAKAO BLIND RECRUITMENT > [1차] 다트 게임

 

[ 문제 파악 ]

 

 

[ 적용한 풀이 ]

function solution(dartResult) {
    let e = dartResult.match(/\d.?\D/g);
    let sentence = [];
    
    for(let i = 0; i < e.length; i++){
        let score = e[i].includes('0') & e[i].includes('1') ? 10 : [...e[i]][0];
        
        if(e[i].includes('S')) score = Math.pow(score, 1);
        if(e[i].includes('D')) score = Math.pow(score, 2);
        if(e[i].includes('T')) score = Math.pow(score, 3);

        
        if(e[i].includes('*')){
                score = score * 2;
            if(i > 0) {
                let double = sentence[i-1];
                double = double*2;
                sentence[i-1] = double;
            }
        }
        if(e[i].includes('#')){
            score = score * (-1);
        }
        sentence[i] = score;
    }
    return sentence.reduce((prev,curr) => {
        return Number.parseInt(prev)+ Number.parseInt(curr)
    })
}

 

[해결 과정 중 실수한 부분 / 잡담]

Regex 묶어주는 연습이 필요하다 원래는 아래와 같이 작성했었다.

let newArr = dartResult.split(/([1-3][SDT][\*\#]?)/g)

그러니 newArr안에 빈 배열이 자를때마다 나왔다.

https://regexr.com/에서 테스트할때는 따로 빈배열이 표시되지 않길래 그렇구나 했었는데

javascript에서 돌려보니 제대로 나오지 않아서 다른 블로그에서 힌트를 얻어서 작업했다.

 

적용한 풀이에서는 그냥 for로 iterate 했는데,

저걸 적용하기 전에는 map()으로 사용하면 되겠다고 생각했다.

그래서 아래와 같이 배열로 뽑은 점수들을 map으로 분류해주면서

let newArr = [];	
newArr = e.map((c,i)=>{
    //code...
    if(c.includes('*')){
            score = score * 2;
        if(i > 0) {
           console.log(...newArr[i-1])
        }
    }
    //code...
}

1. let newArr = e.map()이런식으로 하면

ReferenceError: Cannot access 'newArr' before initialization

이런식으로 에러 메세지를 띄워준다.

그래서..

 

2. newArr 초기화 함

위 코드와 같이 initialization해주고 실행시키면

이전 배열에 있는 점수를 가지고 오려고 '현재 인덱스 - 1' 로 계산하니

값이 나오지 않았다. (undefined로 뜸)

 

내가 내린 결론 : map 함수가 끝나기 전에는 새로운 배열에 값을 넣어두지 않는다.

(그럼 iterate 하면서 return된 값들은 어디다 저장해두는걸까...?)

 

 

댓글