문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/17682
접근방법
문제에 적힌 조건들만 잘 지켜주면 딱히 어려울게 없는 문제였다!
- 입력된 문자열인 dartResult를 숫자(0 ~ 9) / (S, D, T) / (*, #)로 구분해준다.
- 숫자를 따로 저장해뒀다가 S이면 1제곱, D이면 2제곱, T이면 3제곱을 해준다. (필수)
- *이면 현재 점수와 이전 점수에 두배를 해주고, #이면 현재 점수에 -1을 곱해준다. (옵션)
정답코드
function solution(dartResult) {
var answer = 0;
let score = []; // 점수를 저장해 둘 배열
let index = 0; // 점수를 저장해 둔 배열의 인덱스
let temp =''; // 현재 점수 임시저장
for(let i=0;i<dartResult.length;i++){
if(!isNaN(dartResult[i])){ // 숫자
score[index++]=temp;
temp='';
temp += dartResult[i];
if(!isNaN(dartResult[i+1])) { // 10인 경우
temp += dartResult[i+1];
i++;
}
continue; // 아래 조건 확인할 필요 X
}
if(dartResult[i]=='D' || dartResult[i]=='T'){ // D 또는 T (S는 1제곱이므로 패스)
if(dartResult[i]=='D') temp=Math.pow(temp,2); // D이면 2제곱
if(dartResult[i]=='T') temp=Math.pow(temp,3); // T이면 3제곱
continue; // 아래 조건 확인할 필요 X
}
if(dartResult[i]=='*' || dartResult[i]=='#' ) { // * 또는 #
if(dartResult[i]=='*') {
temp*=2; // 현재 점수에 2배
let previous = Number(score[index-1])*2; // 이전 점수에 2배
score[index-1]=previous;
}
if(dartResult[i]=='#') {
temp*=-1; // 현재 점수에 -1 곱해줌
}
continue; // 아래 조건 확인할 필요 X
}
}
score[index]=temp; // 반복문 종료 후, 마지막 값 저장
for(let i=1;i<score.length;i++){ // score[0]에는 ''이 저장되어 있음
answer+=Number(score[i]);
}
return answer;
}
추가 설명
*인 경우에 현재 점수와 이전 점수에 2배를 해준다.
만약 첫 번째 차례에 옵션으로 *이 나온다면 2배를 해줄 점수가 없다.
점수는 score[] 배열에 저장해두는데,
첫 번째 점수를 score[0], 두 번째 점수를 score[1], 세 번째 점수를 score[2]에 순서대로 저장한다면
score[-1] 값을 참조하게 된다.
따라서 score[0]에 아무 값도 없는 temp = ''를 저장해준다.
❗️ 참고 ❗️
음수 인덱스에 접근하면 오류가 발생하는 줄 알았는데, 찾아보니 자바스크립트에서는 음수 인덱스에 접근해도 오류가 발생하지 않는다.
그저 "undefined" 값이 나올 뿐이다.
'Programmers' 카테고리의 다른 글
[Programmers]캐시/JS (1) | 2024.04.05 |
---|---|
[Programmers]등굣길/JS (2) | 2024.04.04 |
[Programmers]롤케이크 자르기/JS (0) | 2024.02.24 |
[Programmers]문자열 압축/JS (0) | 2024.02.23 |
[Programmers]혼자 놀기의 달인/JS (0) | 2024.02.19 |