[자바스크립트] 프로그래머스 Lv.1 [1차]다트게임
....! 어렵지 않게 풀 줄 알았는데
처음 짠 로직에 생각보다 예외 케이스가 너무 많았던 것이었다...!
(일단 숫자 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