on
[프로그래머스] 다트게임 with Javascript
[프로그래머스] 다트게임 with Javascript
다트게임
2018 KAKAO BLIND RECRUITMENT
문제보기
제출 답안
function solution(dartResult) { let answer = []; let tmp = 0; for (let i = 0; i < dartResult.length; i++) { if (dartResult[i] >= 0 && dartResult[i] < 10) { if (dartResult[i] == 1 && dartResult[i + 1] == 0) { tmp = 10; i++; } else { tmp = dartResult[i] * 1; } } else if (dartResult[i] === 'S'){ answer.push(tmp); } else if (dartResult[i] === 'D'){ answer.push(tmp ** 2); } else if (dartResult[i] === 'T'){ answer.push(tmp ** 3); } else if (dartResult[i] === '*'){ answer[answer.length - 1] *= 2; answer[answer.length - 2] *= 2; } else if (dartResult[i] === '#'){ answer[answer.length - 1] *= -1; } } return answer.reduce((a, c) => a + c, 0); }
풀이
dartResult 문자들 전부 조건을 확인해야하는 상황이기 때문에 반복문(for)을 활용하여 dartResult 길이만큼 문자열들 전체 탐색한다.
3회 주어지는 상황별 점수를 저장하기 위해 변수 tmp를 활용한다.
'점수|보너스|옵션' 순서로 확인하기 위해 숫자 값을 제일 먼저 확인하고, 그 다음으로 문자 값(S, D, T)을 확인하고, 마지막으로 기호 값(#, *)을 확인한다. 기호 값은 옵션이기 때문에 없는 상황도 있어서 문자 값 확인을 마치면 빈 배열 answer에 보관한다. 기호 값이 확인되면 각 조건에 맞게 answer 내의 값들을 계산시켜준다.
탐색이 종료되면 answer 내에 3회의 점수 값들이 저장되어 있고, reduce를 활용하여 점수를 합산시켜 반환해준다.
자바스크립트 관련 학습 내용
비교 연산자 관찰하기
반복문 안에서 점수 값 10을 확인하고자 비교 연산자 '=='을 활용했다.
dartResult[i] 값 처음 상태는 숫자 모습을 띄는 문자열이기 때문에 '===' 연산자와 숫자 값을 비교하면 항상 false가 반환된다.
'=='는 값만 비교하고, '==='는 값과 값의 타입까지 함께 비교한다.
// 간단한 예시 let x = '1234'; // typeof(x) === String let y = 1234; // typeof(y) === Number x === y // false x == y // true
reduce 활용
let arr = [2, 5, 6, 9, 10]; arr.reduce((a, c, i, array) => { console.log(a, c, i, array); return a + c; }) // console 창 결과 // 2 5 1 (5) [2, 5, 6, 9, 10] // 7 6 2 (5) [2, 5, 6, 9, 10] // 13 9 3 (5) [2, 5, 6, 9, 10] // 22 10 4 (5) [2, 5, 6, 9, 10] // 반환 값 // 32
reduce() 메서드는 지정된 콜백함수와 누적 초기 값의 기준이 될 숫자 값을 인수로 받는다.
콜백함수의 요소로 누적 값, 현재 값, 현재 값의 인덱스, 현재 배열 상황을 반환할 수 있는 인수를 받는다.
현재 값의 인덱스와 배열 상황을 나타낼 인수는 생략할 수 있다.
누적 초기 값이 생략되면 현재 값이 배열의 인덱스 1에 해당하는 값부터 시작하고, 누적 값에는 인덱스 0에 해당하는 배열의 값이 들어온다.
해당 문제에서는 answer 내 값들을 전부 합산하는데 활용했다.
from http://kgc9175.tistory.com/60 by ccl(A) rewrite - 2021-12-18 02:28:10