hani:) 2023. 6. 21. 14:32

문제

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

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

function solution(dartResult) {    
    let result = [];                          // 1) 결과 값을 저장한 변수 선언 및 할당
    let pat = /\d+[A-Z][*#]?/g;				  // 2) 값을 잘라올 수 있는 패턴 생성
    let gameResults = dartResult.match(pat);  // 3) match 사용하여 생성된 패턴과 일치하는 문자열 배열로 저장

    let i = 0;				 // 4) 현재 인덱스 정보 저장한 변수 선언 및 생성
    let scorePat = /\d+/g;	 // 5) 점수 패턴 생성
    let bonusPat = /[A-Z]/g; // 6) 보너스 패턴 생성
    let optPat = /\*|\#/g;   // 7) 옵션 패턴 생성
    
    // 8) for of문 사용하여 배열 내 모든 요소에 접근
    for (game of gameResults){
        let score = game.match(scorePat)[0]; 			// 9) 패턴 사용하여 점수 가져오기
        let bonus = game.match(bonusPat)[0]; 			// 10) 패턴 사용하여 보너스 가져오기
        let opt = game.match(optPat); 		 			// 11) 패턴 사용하여 옵션 가져오기
        let option = (game.match(optPat)) ? opt[0]: ""; // 12) 옵션은 있을 수도 없을 수도 있음, 있는 경우 옵션 값 아니면 빈 문자열 저장 
        
        // 13) 보너스 값 확인하여 제곱근으로 넣어줄 값 결정
        let n = 1; // 기본으로 S의 값을 넣어줌
        if (bonus === "D") n = 2;
        else if (bonus === "T") n = 3;
        let num = Math.pow(score, n);
        
        // 14) 옵션이 존재하는 경우 아래 로직 수행
        if (option === "*") { // 스타상: 이전 값, 현재 값 모두 2배
            num *= 2; 		// 14-1) 현재 값 2배
            if (i > 0) {    // 14-2) 이전 값 2배 (이전 값이 존재하는 경우에만)
                let t = result[i-1] * 2;
                result[i-1] = t;
            }
        } else if (option === "#") { // 아차상: 음수 값으로 변함
            num = -num; 	// 14-3) 양수에서 음수로 변경
        }
        result.push(num);
        i++; // 15) 현재 배열의 인덱스 증가
    } 
    // 16) reduce 메소드 사용하여 전체의 합 구해서 리턴
    return result.reduce((a, b) => a + b);
}

 

참고 사이트

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org

 

728x90