다트 게임

이종호·2021년 4월 9일
0

알고리즘

목록 보기
5/10
post-thumbnail

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

내 풀이

function solution(dartResult) {
  var answer = 0;
  let s = dartResult;
  let i;
  let start = 0;
  let arr = []
  if (s.length == 0) {
    return 0;
  }
  for (i = 2; i < s.length; i++) {
    if (/\d/.test(s[i])) {
      arr.push(s.slice(start, i))
      start = i
      i += 1
    }
  }
  arr.push(s.slice(start, i))
  let newArr = []

  arr.forEach((el, i) => {
    let line = [];
    line.push(el.match(/10|\d/)[0])
    line.push(el.match(/[SDT]/)[0])
    if (/[*#]/.test(el)) {
      line.push(el.match(/[*#]/)[0])
    }
    newArr.push(line)
  })
  newArr.forEach((el, i) => {
    if (el[1] === 'D') {
      el[0] **= 2
    } else if (el[1] === 'T') {
      el[0] **= 3
    }
    el[0] *= 1

    if (el[2] === '*') {
      if (i === 0) {
        el[0] *= 2
      }
      else {
        el[0] *= 2
        newArr[i - 1][0] *= 2
      }
    } else if (el[2] === '#') {
      el[0] *= -1
    }
  })
  newArr.forEach(e => {
    answer += e[0]
  })

  return answer;
}

설명

  1. 첫 for문에서 숫자를 기준으로 구간을 나눠 배열에 저장했다.
    이때, 숫자의 종류는 0~10이고, 한 구간의 길이의 범위는(1S ~ 10S*)이므로 i+=1 하여 두자리도 받을 수 있도록 햇다.

  2. 2번째 for문에선 나눈 구간을 다시 숫자, 배수, 옵션이 있다면 옵션까지 나눠주도록 했다.

  3. 3번째 for문은 나눈 구간을 이용해서 숫자를 결과값으로 바꿔 놓았다.

  4. 4번째 for문에선 마지막으로 결정된 값을 모두 더해주도록 했다.

너무 길다.

너무 길다.
일단 다른 살마 답지를 보지 않고 최대한 줄여보고
후에 다른 사람의 답지를 보면 어떻게 하면 더 줄이면서 가독성을 좋게 할 것인지 정리해 봐야 겠다.

그래도

그래도 이렇게 생각대로 구현할 수 잇는 힘이 조금 는것 같아서 기분이 좋다.!

profile
코딩은 해봐야 아는 것

0개의 댓글