-
[프로그래머스 1단계] [1차] 다트 게임알고리즘 2024. 2. 13. 18:09
❓문제 설명
- 다트게임을 할것임 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) 이렇게 하나 위에처럼 하나 같은 결과가 나온다
'알고리즘' 카테고리의 다른 글
[프로그래머스 1단계] 체육복 (0) 2024.02.28 [프로그래머스 1단계] 기사단원의 무기 (0) 2024.02.21 [프로그래머스 1단계] [1차] 비밀지도 (1) 2024.02.05 [프로그래머스 1단계] 신고 결과 받기 (0) 2024.01.29 [프로그래머스 1단계] 성격 유형 검사하기 (0) 2024.01.26