본문 바로가기
ComputerScience/알고리즘, 프로그래머스

[Lv.1] 다트게임(정규식, string메소드, 조건반복문 혼합) (카카오)

by VictorMeredith 2023. 2. 2.

1. 문제

2. 전략

 1) 정규식을 통해 [점수영역, (보너스), 점수영역, (보너스), 점수영역, (보너스)] 형태의 배열로 만든다

 2) 배열을 순회하며 보너스를 조건에 따라 계산해준다.

 3) 배열 중 점수영역을 합쳐서 return.

 

function solution(dartResult) {
    var answer = 0;
    
    let reg = /\d{1,2}\w|\*|\#/g; //정규식 
    // /d는 모든숫자이며 뒤에 붙은 {1,2}는 최대1개, 최대2개 
    // /w는 모든문자
    // | 는 or 연산자이다.
    // \*는 '*', \#는 '#' 이다.
    
    let arr = dartResult.match(reg) // 정규식 메소드
    // string.match(RegExp) : string에서 정규식에 match 되는 요소를 배열로 리턴해준다.
    // ex) ['5S','#', '2T', '*', '3D'] 의 형태로 나온다
    
    let res = [] //결과를 계산해서 담을 배열을 만든다
    
    for(i in arr){ //점수의 알파벳영역부분을 계산해서 다시 재배열한다.
        if(arr[i] === '#'){
            res.push('#')
        }
        else if(arr[i] === '*'){
            res.push('*')
        }
        else{
            let word = arr[i].substr(arr[i].length-1,1) 
            // 문자열 자르기: string.substr(자르기시작index,몇개자를거임?)
            let num = arr[i].replace(word,'');
            // 문자열 교체하기(하나만삭제로도 사용) : string.replace(바꿀거, 뭐로바꿈?)
            if(word === 'S'){
                res.push(Math.pow(num,1)) 
                // 제곱수 표현하기 Math.pow(밑,지수)
            }
            else if(word === 'D'){
                res.push(Math.pow(num,2))
            }
            else if(word === 'T'){
                res.push(Math.pow(num,3))
            }
        }
    }
    // res = [5, '#', 8, '*', 9]의 형태로 알파벳이 계산되었다.
    
    for(j = 0; j<res.length; j++){ //다시 순회하면서 보너스영역을 계산한다
        if(j !== 0 && res[j]=== '#'){ //#일 경우 이전점수를 음수로 바꾼다
            res[j-1] *= -1
            
        }
        else if(j !== 0 && res[j] === '*'){ // *일경우 이전 두개의 점수가 두배가되므로
            if(j === 1){ //1번째에 *이 나온 경우
                res[0] *= 2
            }
            else if(res[j-2] ==='*' || res[j-2] === '#'){ 
            //배열의 이전이전 요소가 점수숫자가 아닌경우
                res[j-3] *= 2;
                res[j-1] *=2;
            }
            else{
            //배열의 이전이전 요소가 점수숫자인 경우
                res[j-2] *=2
                res[j-1] *=2                
            }
        }
    }
    
    
    for(r in res){ //보너스 글자를 제외한 점수를 더한다.
        if(res[r] !== '#' && res[r] !== '*'){
            answer += res[r]
        }
    }
    return answer;
}

3. 알아야할 사항

 1) 정규표현식 :

   - let reg = /요기에 조건을 넣는다/g   : g는 글로벌에서 찾음 

   - let reg = new RegExp('/요기에 조건을 넣는다/',flag)  :  flag는 옵션이다(g는 모든곳에서 찾음, i는 대소문자 구별안함 등등 여러가지 있다. 구글링 해보자.)

   - string.match(reg) : string에서 reg 정규표현식에 일치하는 글자(들)를 찾아준다. 

 

 2) 문자열과 지수

   - 문자열 자르기: string.substr(자르기시작index,몇개자를거임?)
   - 문자열 교체하기(하나만삭제로도 사용) : string.replace(바꿀거, 뭐로바꿈?)
   - 제곱수 표현하기 Math.pow(밑,지수)

댓글