티스토리 뷰
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
- 다트 게임은 총 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, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
코딩테스트 연습 - [1차] 다트 게임 | 프로그래머스
programmers.co.kr
풀이
function solution(dartResult) {
let result = dartResult.split(/(\d+\D\W|\d+\D)/).filter(Boolean);
let score = [];
for(let i = 0; i < result.length; i++) {
let num = 0;
result[i] = result[i].split(/(\d+)(\D)/).filter(Boolean);
if(result[i][1].includes('S')) num = 1
if(result[i][1].includes('D')) num = 2
if(result[i][1].includes('T')) num = 3
score.push(Math.pow(result[i][0], num));
if(result[i][2] == '#') score[i] *= -1;
if(result[i][2] == '*') {
score[i] *= 2;
score[i-1] *= 2;
}
}
return score.reduce((acc, cur) => acc + cur);
}
1. 받은 문자열을 정규표현식을 이용해 세개의 라운드로 분리함. (아직 정규표현식을 제대로 못해서ㅠㅠ)
2. 결과를 담아줄 score 배열 생성
3. for문을 돌리면서 각 라운드별 스코어와 영역, 상을 split으로 다시 한 번 분리해줌. 이때도 정규표현식을 쓰려고 노력해봄
4. if문을 이용해 S는 1, D는 2, T는 3을 num 변수에 넣어줌
5. 라운드의 첫값인 스코어와 num을 이용해 pow로 최종 스코어를 계산하여 score 배열에 넣어줌
6. 만약 현재 라운드 마지막 배열값이 '#'이면 스코어 배열 값에 -1을 곱해줌
7. 만약 현재 라운드 마지막 배열값이 '*'이면 스코어 배열 값, 이전 스코어 배열 값에 2를 곱해줌
8. reduce를 이용해 score 배열 값을 합쳐서 반환
'1Day 1Algorithm' 카테고리의 다른 글
[DAY 34] Left Rotation (0) | 2019.11.09 |
---|---|
[DAY 33] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT) (0) | 2019.11.06 |
[DAY 31] 문자열 다루기 기본 (0) | 2019.11.01 |
[DAY 30] 문자열 내 마음대로 정렬하기 (0) | 2019.10.31 |
[DAY 29] 실패율 (2019 KAKAO BLIND RECRUITMENT) @ (0) | 2019.10.29 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Webpack
- 운영체제
- javascript
- js
- 리액트
- 타입스크립트
- 멀티프로그래밍
- sort
- React
- 구간합
- 자료구조
- 알고리즘
- Typescript
- Algorithm
- 배열
- Props
- reduce()
- sort()
- 시분할시스템
- 웹팩
- 1day1algorithm
- 배치처리시스템
- 프로그래머스
- greedyAlgorithm
- 우아한테크러닝
- OS
- Array
- redux-saga
- 컴퓨터공학
- 자바스크립트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함