알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm
JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS
React 강의 듣기
https://github.com/hoinlee-moi/React_prac
드디어 길고 긴 평일이 끝나고 주말이 찾아왔다.
휴식시간을 많이 가지면서 밀렸던 강의를 듣기로 했는데 두통이 점점 많이 와서 과연 가능할까 싶다.
그래도 최선을 다해서 공부하고 후회 없도록 하자
다트게임
2018 KAKAO BLIND RECRUITMENT
처음엔 어려웠는데 차근차근 생각하다보니 풀리긴 했다.
다른 사람 풀이를 비교해 보는데 대부분이 비슷한 느낌이다
function solution(dartResult) {
let bonusScore = [1,1,1];
const scoreArr = dartResult.split(/[^0-9]/g).filter(v=>v!="");
const plusScoreArr = dartResult.split(/[0-9]/g).filter(v=>v!="").map((v,i)=>{
if(v[1]==="*"){
bonusScore[i-1] *=2
bonusScore[i] *=2
} else if(v[1]==="#") bonusScore[i] *= -1
if(v[0]==="S")return scoreArr[i]**1
if(v[0]==="D")return scoreArr[i]**2
if(v[0]==="T")return scoreArr[i]**3
})
return plusScoreArr.reduce((acc,cur,idx)=>{
return acc+(cur * bonusScore[idx])
},0)
}
1.
전제 조건으로 기회가 3번이니 배열의 인덱스는 총 3개로 구성했다.
먼저 bonusScore를 배열로 지정해 두었는데 이는 *
이나 #
값이 들어올 때 각 기회 별로 곱해줄 값을 따로 빼기 위해서 두었다.
bonusScore 배열을 1,1,1로 둔 이유는 *
이 중첩될 경우 2*2
배나 #이 중첩될 경우 2*-1
등을 해야하는데 0으로 둘 경우 곱하면 0 값이 도출 되고 1은 곱해도 자기자신이기 때문에 그 기회에 *
이나 #
값이 없더라도 문제가 없다.
2.
-split의 정규식을 활용하여 각 기회별로 숫자 점수 부분을 뜯어낸 배열scoreArr
S,D,T와 *,#으로 이루어진 배열plusScoreArr
을 만들어 낸다.
이 때 S,D,T와 *
,#
으로 이루어진 배열에서 map
을 이용해 각 인덱스 값에 *
이 있으면 bonusScore
와 같은 인덱스에 *2
그 전 인덱스에 *2
를 해서 효과를 넣고 #
으로 될 경우 bonusScore
에서의 같은 인덱스에 *-1
을 한다
그리고 동시에 S,D,T를 구별하여 scoreArr
의 같은 위치의 인덱스를 제곱한 값으로 return
하여 plusScoreArr
의 값은 *
과#
을 제외한 숫자 점수와 S,D,T점수만을 계산한 배열로 변한다.
3.
plusScoreArr
을 reduce
하는 데 이때 현재 값과 같은 위치(같은 기회)의 bonusScore
를 곱하여 계산합니다.(각 기회별로 스타상과 아차상이 적용될 수 있도록)