일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 토이프로젝트
- 리액트
- Hello Coding HTML5+CSS3
- express
- 자바
- 모듈 배포하기
- html
- 우아한형제들
- 자바스크립트
- 자바스크립트 객체
- 우아한테크코스
- 인사이드 자바스크립트
- 회고의 회고
- toast
- 코드스쿼드
- 러닝 자바스크립트
- npm
- 네이버 테크 콘서트
- ES6
- 레인지 슬라이더
- 우아한테크캠프
- 프로그래머스
- 개인 프로젝트
- CSS
- 우아한테크캠프 4기
- 함수
- 주간 회고
- 알고리즘
- AWS
- 토이 프로젝트
- Today
- Total
블로그
[프로그래머스, 자바스크립트] 알고리즘-39 다트 게임 본문
출처 : 프로그래머스 알고리즘 코딩테스트 Level.1
https://programmers.co.kr/learn/courses/30/lessons/17682?language=javascript
다트 게임
문제카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다.
다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다.
다트 게임의 점수 계산 로직은 아래와 같다.다트 게임은 총 3번의 기회로 구성된다.
각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시
점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시
해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다.
아차상(#) 당첨 시 해당 점수는 마이너스된다. 스타상(*)은 첫 번째 기회에서도 나올 수 있다.
이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다.
이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다.
이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
0~10의 정수와 문자 S, D, T, _, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.입력 형식
점수|보너스|[옵션]으로 이루어진 문자열 3세트.
예) 1S2D*3T점수는 0에서 10 사이의 정수이다.
보너스는 S, D, T 중 하나이다.
옵선은 *이나 # 중 하나이며, 없을 수도 있다..출력 형식
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37입출력 예시
예제 dartResult answer 설명 1 1S2D*3T 37 11 _ 2 + 22 _ 2 + 33 2 1D2S#10S 9 12 + 21 * (-1) + 101 3 1D2S0T 3 12 + 21 + 03 4 1S2T3S 23 11 _ 2 _ 2 + 23 * 2 + 31 5 1D#2S*3S 5 12 _ (-1) _ 2 + 21 * 2 + 31 6 1T2D3D# -4 13 + 22 + 32 * (-1) 7 1D2S3T* 59 12 + 21 _ 2 + 33 _ 2
풀이 과정
1. dartResult를 숫자, 영문, 특수문자로 분류한다.
2. 분류한 방식에 따라 다른 계산을 진행한다.
3. 정규표현식을 이용하여 분류하는게 편하다.
답안
function solution(dartResult) {
let nums = [];
let cnt = 0;
for (let i = 0; i < dartResult.length; i += 1) {
let s = dartResult[i];
if (/\d/.test(s)) {
if (/\d/.test(dartResult[i - 1])) {
nums[cnt - 1] = 10;
} else {
nums.push(+s);
cnt += 1;
}
} else if (/[SDT]/.test(s)) {
nums[cnt - 1] = Math.pow(
nums[cnt - 1],
s === "D" ? 2 : s === "T" ? 3 : 1
);
} else {
if (s === "*") {
nums[cnt - 1] *= 2;
if (cnt > 1) {
nums[cnt - 2] *= 2;
}
} else {
nums[cnt - 1] *= -1;
}
}
}
return nums.reduce((total, cur) => total + cur);
}
'알고리즘' 카테고리의 다른 글
[프로그래머스, 자바스크립트] 알고리즘-41 124 나라의 숫자 (0) | 2020.01.04 |
---|---|
[프로그래머스, 자바스크립트] 알고리즘-40 프린터 (0) | 2020.01.02 |
[프로그래머스, 자바스크립트] 알고리즘-38 비밀지도 (0) | 2019.12.31 |
[프로그래머스, 자바스크립트] 알고리즘-37 실패율 (0) | 2019.12.30 |
[프로그래머스, 자바스크립트] 알고리즘-36 문자열 압축 (0) | 2019.12.29 |