-
[자바스크립트] 프로그래머스 Lv.1 [1차]다트게임[TIL] 카테고리/알고리즘 문제풀기 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
'[TIL] 카테고리 > 알고리즘 문제풀기' 카테고리의 다른 글
[자바스크립트] 프로그래머스 Lv.1 신고 결과 받기 (0) 2022.06.03 [자바스크립트] 프로그래머스 Lv.1 크레인 인형뽑기 게임 (0) 2022.06.01 [자바스크립트] 프로그래머스 Lv.1 [1차] 보물지도 (0) 2022.05.31 [자바스크립트] 프로그래머스 Lv.1 폰켓몬 (0) 2022.05.30 [자바스크립트] 프로그래머스 Lv.1 체육복 (0) 2022.05.29