알고리즘 문제 풀기

프로그래머스: [1차] 다트 게임 - javascript(switch, 정규식)

Fo_rdang 2024. 4. 3. 11:02
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/17682

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 힌트 

문제 정리) 

- s는1제곱, d는2제곱, t는 3제곱 
 - *은 해당 점수 *2, 이전 점수 *2 (만약, 해당 점수가 첫번째라면 해당 점수만 *2)
 -  #은 곱하기 -1 
 

문제 풀이 ) 

- 반복문을 돌려서 'S', 'D', 'T' 를 찾는다. 

- 'S', 'D', 'T' 이전의 index 값 즉 숫자에다가 각각 s,d,t 곱한후  temp 배열에 push 한다. (유의할 점: 10은 두자리 수니까 예외 처리)

- '*'이 나오면 temp 배열의 마지막 숫자와 마지막의 이전 숫자를 꺼내서 또 계산해준다(*은 곱하기2)

- '#'이 나오면 temp 배열의 마지막 숫자를 꺼내서 또 계산해준다 (#은 -1 곱하기)

 

 

정답 풀이 코드 

function solution(dartResult) {
    let temp = []; //숫자 넣는 임시 배열 
    for(let i=0; i<dartResult.length; i++){ //반복문 돌리기 
        if(dartResult[i] == 'S'){ //S일 때 
             if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외
                temp.push(10) 
             }else{
               temp.push(Math.pow(dartResult[i-1],1)) //1제곱해서 temp에 push   
             } 
        }else if(dartResult[i] === 'D'){ //D일 때 
            if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외처리
                temp.push(100) 
             }else{
           temp.push(Math.pow(dartResult[i-1],2)) //2제곱해서 temp에 push 
             }
        }else if(dartResult[i] === 'T'){ //T일 때 
            if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){ //숫자 10일 때 예외처리
                temp.push(1000) 
             }else{
           temp.push(Math.pow(dartResult[i-1],3)) }//3제곱해서 temp에 push 
        }else if(dartResult[i] === '*'){ //*일 때 
            let num1 = temp.pop() *2; /현재 숫자 
            let num2 = 0; //이전숫자 
            if(temp.length !== 0){  //이전숫자가 있을 때 
                 num2 = temp.pop() *2; //이전숫자도 빼서 제곱      
                temp.push(num2); //다시 temp에 넣어준다. 
            }
                 temp.push(num1); //현재 숫자 temp에 push   
        }else if(dartResult[i] === '#'){  // #일 때, 
            let num1 = temp.pop() * (-1);//현재 숫자 빼서 -1 곱한다. 
                 temp.push(num1) //temp에 다시 넣기 
            
        }
    }
   let answer =  temp.reduce((a,b)=> a+b, 0); //temp에 있는 숫자 다 더하기 
    return answer; 
}

 

Only 풀이 코드 

function solution(dartResult) {
    let temp = []; 
    for(let i=0; i<dartResult.length; i++){
        if(dartResult[i] == 'S'){
             if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
                temp.push(10) 
             }else{
               temp.push(Math.pow(dartResult[i-1],1))   
             } 
        }else if(dartResult[i] === 'D'){
            if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
                temp.push(100) 
             }else{
           temp.push(Math.pow(dartResult[i-1],2))
             }
        }else if(dartResult[i] === 'T'){
            if(dartResult[i-2] === '1' && dartResult[i-1] === '0' ){
                temp.push(1000) 
             }else{
           temp.push(Math.pow(dartResult[i-1],3)) }
        }else if(dartResult[i] === '*'){
            let num1 = temp.pop() *2;
            let num2 = 0; 
            if(temp.length !== 0){
                 num2 = temp.pop() *2;       
                temp.push(num2);
            }
                 temp.push(num1);;   
        }else if(dartResult[i] === '#'){
            let num1 = temp.pop() * (-1);
                 temp.push(num1)
            
        }
    }
   let answer =  temp.reduce((a,b)=> a+b, 0); 
    return answer; 
}

 

추천하고 싶은, 다른 사람 풀이 코드 

추천하는 이유: 문제를 보고 정규식 switch를 적극 활용해야 한다는 것을 느꼈다. 

function solution(dartResult) {
  const reg = /[\d]+[SDT][*#]*/g;
  const input = dartResult.match(reg);
  const result = [];

  for (let i = 0; i < input.length; i++) {
    let number = input[i].match(/[\d]+/g)[0];
    const bonus = input[i].match(/[SDT]/g)[0];
    const option = input[i].match(/[*#]/g);

    switch (bonus) {
      case 'S':
        number = Number(number);
        break;
      case 'D':
        number = Math.pow(number, 2);
        break;
      case 'T':
        number = Math.pow(number, 3);
        break;
    }

    result[i] = number;

    if (option) {
      switch (option[0]) {
        case '*':
          result[i - 1] *= 2;
          result[i] *= 2;
          break;
        case '#':
          result[i] *= -1;
          break;
      }
    }
  }

  return result.reduce((acc, cur) => {
    return acc + cur;
  });
}
반응형