728x90
반응형
24년 12월 26일
해결한 문제 갯수: 3
문제 설명
문제 분석
- 다트 게임은 총 3번의 기회로 구성됩니다.
- 각 기회마다 0-10점을 얻을 수 있습니다.
- S, D, T는 각각 1제곱, 2제곱, 3제곱을 의미합니다.
- '*'는 해당 점수와 바로 전 점수를 2배로 만듭니다.
- '#'은 해당 점수를 마이너스로 만듭니다.
첫 번째 접근: reduce() (O(n))
function solution(dartResult) {
const bonus = { S: 1, D:2, T:3 }
return Array.from(dartResult).reduce((answer, c) => { // 문자열을 한글자씩 처리
if(Number.isNaN(Number(c))) {
if(bonus[c]) {
answer.result.push(Math.pow(answer.num, bonus[c]))
}
else if(c === '*') {
answer.result[answer.result.length - 1] *= 2
answer.result[answer.result.length - 2] *= 2
}
else {
answer.result[answer.result.length - 1] *= -1
}
answer.num = ''
}
else answer.num += c // 숫자인 경우, 문자열로 숫자 누적
return answer
}, {result: [], num: ''}).result.reduce((a, c) => a += !Number.isNaN(Number(c)) && c )
}
- score.sort() : score를 내림차순으로 정렬합니다.
- while
- slice() : score 배열을 m개씩 slice한 후, 가장 마지막 인덱스 요소를 answer에 더합니다.
- splice() : score 배열을 업데이트 합니다.
두 번째 접근: for ~ of...
function solution(dartResult) {
const bonus = { S: 1, D: 2, T: 3 };
const scores = [];
let currentScore = '';
for(let char of dartResult) {
if(!isNaN(char)) {
currentScore += char;
} else {
if(bonus[char]) {
scores.push(Math.pow(Number(currentScore), bonus[char]));
currentScore = '';
} else if(char === '*') {
scores[scores.length-1] *= 2;
if(scores.length > 1) scores[scores.length-2] *= 2;
} else if(char === '#') {
scores[scores.length-1] *= -1;
}
}
}
return scores.reduce((sum, score) => sum + score, 0);
}
728x90
반응형
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
[프로그래머스] 해시 - 완주하지 못한 선수 (0) | 2024.12.28 |
---|---|
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2024.12.28 |
[프로그래머스] 과일 장수 (1) | 2024.12.24 |
[프로그래머스] 포켓몬 (0) | 2024.12.23 |
[프로그래머스] [1차] 비밀지도 (1) | 2024.12.21 |