[TIL] 카테고리/알고리즘 문제풀기

[자바스크립트] 프로그래머스 Lv.1 [1차]다트게임

티레이니 2022. 6. 1. 22:20

 

 

....! 어렵지 않게 풀 줄 알았는데

처음 짠 로직에 생각보다 예외 케이스가 너무 많았던 것이었다...!

(일단 숫자 10(...), 첫번째 Score가 스타상일때, 스타상 옵션이 중첩될때...)

결국 이것저것 조건을 덧붙이다보니 괴상한 녀석이 탄생했다.

으... 지저분해....

 

let answer = dartResult.split('').map((s,i) => 
  s === 'S' ? dartResult[i-1] === '0' && dartResult[i-2] === '1' ? 10 : dartResult[i-1]**1 : 
  s === 'D' ? dartResult[i-1] === '0' && dartResult[i-2] === '1' ? 100 : dartResult[i-1]**2 : 
  s === 'T' ? dartResult[i-1] === '0' && dartResult[i-2] === '1' ? 1000 : dartResult[i-1]**3 : s)
  .filter((s) => typeof(s) === 'number' || s === '#' || s === '*' )
  .map((s,i,arr) => s === '#'? arr[i-1]*-1 : s)
  .reduce((acc,s,i,arr) => {
    let currentScore = s
    let prevBonus = 0
    if (currentScore < 0) {
      currentScore *= 2
    }
    if (s === "*") {
        currentScore = arr[i-1]
        prevBonus = arr[i-2] && arr[i-2] !== '*' ? arr[i-2] : arr[i-2] === '*' ? arr[i-3]*2 : 0
      }
    return acc + currentScore + prevBonus
  },0)

 

1) 일단 점수들을 다 숫자로 바꿔준다.  -> 숫자와 #, * 만 남은 상태의 배열 탄생!
   * map을 썼더니 문자열로 된 숫자들을 도로 다 빼줘야했다. 더 효율적인 방식이 있었을듯 싶다..
    그냥 아예 새로 배열을 만들걸 그랬나?

2)  #을 배열의 이전 요소 * -1 로 만들어 줬다

 

3) 대망의 점수계산... 마찬가지로 더 나은 방식이 있었을텐데 하는 아쉬움.

    reduce를 사용했고, acc에 현재 점수와 * 로 인해 발생되는 이전 점수의 보너스를 더하는 방식으로 진행했다.
    - 현재 점수가 음수일경우 (위에서 처리했던 # 이다) *2 해준다 (따로 뺀 이유는 * 점수와 중첩되지 않기위해)

    - 스타상(*)이 발견될 경우, 우선 스타상의 값을 배열상 이전 요소(i-1)와 같게 준다.
      (이전 요소는 이미 acc에 더해졌기 때문에 이로서 2배 점수가 되었다)
      그리고 그 전의 점수(i-2)가 있는 경우 preBonus 는 i-2 번째 요소이다. 

      i-2 번째 요소가 *이라면 (보너스 점수가 중첩된 경우) 그 전 요소.. (i-3) 의 2배가 보너스 점수이다..

 

 

 

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr