오늘의 코딩 테스트 한줄 - [1차] 다트 게임

Edwin·2023년 6월 5일
0
post-thumbnail

오늘의 코딩 테스트 한줄 - [1차] 다트 게임

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

01 다트 게임은 총 3번의 기회로 구성된다.
02 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
03 .점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
04 옵션으로 스타상() , 아차상(#)이 존재하며 스타상() 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
05 스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상()의 점수만 2배가 된다. (예제 4번 참고)
06 스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상() 점수는 4배가 된다. (예제 4번 참고)
07 스타상(
)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
08 Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
09 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

예제

예제dartResult설명answer
11S2D*3T111^1 2 + 222^2 2 + 333^337
21D2S#10S121^2 + 212^1 * (-1) + 10110^19
41S2T3S111^1 2 2 + 232^3 * 2 + 3123
51D#2S*3S121^2 (-1) 2 + 212^1 * 2 + 313^15

문제풀이

풀이시간 : 1시간
메모리: 33.6 MB, 시간: 0.08 ms

function solution(dartResult) {
    let result = [];
    let numElements = ''
    for(let i=0;i < dartResult.length; i++) {
        let current = dartResult[i]
      if(current === 'S') {
         result.push(Math.pow(numElements, 1))
         numElements = ''
         } else if (current === 'D') {
            result.push(Math.pow(numElements, 2))
             numElements = ''
          } else if (current === 'T') {
            result.push(Math.pow(numElements, 3))
            numElements = ''
          } else if (current === '*') {
            result[result.length-2] = result[result.length-2]*2
            result[result.length-1] = result[result.length-1]*2
         } else if (current === '#') {
            result[result.length-1] = result[result.length-1]*-1
         } else {
             numElements += current;
         }
    }

    return result.reduce((pre, cur) => pre+cur, 0)
}

01 변수 result : 최종적으로 반환할 내용을 담을 배열이며, 반환은 reduce를 통해서 하나의 값으로 도출하여 내보내려한다.
02 변수 numElements : 조건에 부합하는 요소를 만들어내기 위한 변수이다.
03 반복문 : for문을 돌면서, 문자열의 인덱싱을 통해서, 생성된 요소들을 result에 입력한다.
04 조건문 : 문자열의 인덱싱에 담겨진 값에 따라서 아래와 같이 조건을 분기하였다.

  • 조건문(6) : 모든 조건이 충족되지 않는, 즉 숫자인 경우, numElements에 값을 담는다.
  • 조건문(1) : "S"인 경우, numElements에 1제곱한 내용을 result에 담고 numElements를 비운다.
  • 조건문(2) : "D"인 경우, numElements에 2제곱한 내용을 result에 담고 numElements를 비운다.
  • 조건문(3) : "T"인 경우, numElements에 3제곱한 내용을 result에 담고 numElements를 비운다.
  • 조건문(4) : "*"인 경우, result에 있는 직전 요소와, 앞앞에 있는 요소에 2를 곱해준다.
  • 조건문(5) : "-"인 경우, result에 있는 직전 요소에 *(-1)을 해준다.

조건문(4)인 경우, 문제를 잘못읽어서, 직전의 모든 요소에 곱을 해주어야 된다고 생각하여, map을 선언했다가 올바른 접근이 아닌 것을 발견했다. 다른 사람의 풀이를 보니 정규표현식을 사용하여 풀어간 내용이 보이는데, 이는 다음 기회에 해당 방법으로 풀어볼 예정이다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글