ref: https://programmers.co.kr/learn/courses/30/lessons/17682
총 3번의 기회
Single(S) 1제곱 , Double(D) 2제곱, Triple(T) 3제곱
*는 이전 점수까지 2배, #는 현재 값 마이너스.
총 3번 기회니까 시간 복잡도는 충분하다.
스택, 문자열 변환
def solution(dartResult):
dartResult = dartResult.replace('10','A')
stack = []
tmp = 0
for i in dartResult:
if i.isdigit() or i == 'A':
if i.isdigit():
tmp = int(i)
else:
tmp = 10
elif i in ['S','D','T']:
if i == 'D':
tmp **= 2
elif i == 'T':
tmp **= 3
stack.append(tmp)
tmp = 0
elif i in ['*','#']:
if i == '*':
if len(stack) >1:
pop_1 = stack.pop()
pop_2 = stack.pop()
stack.append(pop_2 * 2)
stack.append(pop_1 * 2)
else:
stack.append(stack.pop() * 2)
elif i == '#':
stack.append(-stack.pop())
return sum(stack)
function solution(dartResult) {
let afterConvert = dartResult;
while(afterConvert.replace('10','A') !== afterConvert){
afterConvert = afterConvert.replace('10','A');
};
const answerReck = [];
const mutiple = ['S','D','T'];
const bonus = ['*','#'];
for(let i=0; i<afterConvert.length;i++){
const now = afterConvert[i];
if (!isNaN(now) || now === 'A'){
if (now === 'A'){
answerReck.push(10);
} else{
answerReck.push(parseInt(now));
}
} else if(mutiple.includes(now)){
if (now === 'D'){
answerReck[answerReck.length-1] **= 2
} else if(now === 'T'){
answerReck[answerReck.length-1] **= 3
}
} else if(bonus.includes(now)){
if (now === '*'){
if(answerReck.length >1){
answerReck[answerReck.length-2] *= 2
answerReck[answerReck.length-1] *= 2
}else{
answerReck[answerReck.length-1] *= 2
}
} else{
answerReck[answerReck.length-1] = -answerReck[answerReck.length-1]
}
}
}
// console.log(answerReck);
return answerReck.reduce((a,b) => a+b);
}
파이썬의 replace는 전부 원하는 값으로 바꾸지만,
자바스크립트의 replace는 왼쪽부터 찾기 시작해서 처음 발견하는 것만 바꾼다.
코드의 깔끔함이 비교가 안된다...