❓문제 설명
- 다트게임을 할것임 3번을 던져서 보너스도 있고 감점하게 만드는 요소도 있음
- 게다가 다트가 박히는 구역별로 제곱값 또는 세제곱값을 주는 요소도 있음
- 그래서 대충 "1D2S#10S" 이런식으로 문자열이 나오는데 이걸 점수로 바꿔놓아야함
- 부가적은 조건은 문제에 보면 있음 그거 보면서 풀어보셈
✅ 문제 해결
- 예외에 대한 처리를 해야하는데 어디서부터 해야할지 막막했음.
- *이게 연산을 개떡같이 하니깐 이거부터 처리할까하다가 반복문을 돌리게 되면 문자 하나씩 들어갈텐데 10이라는 숫자가 눈에 띄었음 그래서 이거 먼저 처리하고 나머지 값에 대해서 처리를 해야할 것 같음
- 이후에는 반복문을 돌았을 때 어떠한 값을 return해주면 되는데 이럴 때에는 break를 쓰는게 좋을 것 같아 switch를 사용해보겠음
- 먼저 숫자에 대한 처리를 하고 이후에 문자에 대해서 index값을 가지고 처리를 해보겠음
function solution(dartResult) {
const state = { star:'*', oops:'#', Single:'S', Double:'D', Triple:'T'};
let score = 0, scores = []
for (let i= 0; i < dartResult.length; ++i) {
if (!isNaN(dartResult[i])) {
score = +dartResult[i-1] === 1 ? 10 : +dartResult[i]
} else {
switch(dartResult[i]) {
case state.Single:
scores.push(score)
break;
case state.Double:
scores.push(score ** 2)
break;
case state.Triple:
scores.push(score ** 3)
break;
case state.star:
if (scores.length -2 >= 0) {
scores[scores.length -2] *= 2
}
scores[scores.length - 1] *= 2;
break;
case state.oops:
scores[scores.length - 1] *= -1
break;
}
}
}
return scores.reduce((a, b)=> a += b)
}
❕느낀점
- 문자에 +를 앞에 붙였을 때 숫자로 변환된다면 타입값을 간단히 바꿀 수 있고 이를 통해 문자인지 숫자인지 확인할 수 있음 +'9' == 9 숫자로 변환하지 못하는 값은 NaN을 반환함 근데 이걸 그대로 조건문에 넣으면 0이 false값으로 되기에 주의해야 함
- 반복문을 돌리면서 예외처리에 대해서 각각 다르게 처리를 해야하는 경우 길이가 다른 것부터 처리를 하는 것이 좋다.
- Math.pow(a, 2) 이렇게 사용하나 a**2이렇게 사용하나 성능 상 차이는 없다고 한다
- reduce를 사용할 때 reduce((a, b)=> a + b, 0) 이렇게 하나 위에처럼 하나 같은 결과가 나온다