파이썬, 자바스크립트_카카오 Lv.1 - [1차] 다트 게임

naughty _deer·2022년 4월 29일
0

코딩테스트

목록 보기
5/7

ref: https://programmers.co.kr/learn/courses/30/lessons/17682

문제 요약:

총 3번의 기회
Single(S) 1제곱 , Double(D) 2제곱, Triple(T) 3제곱
*는 이전 점수까지 2배, #는 현재 값 마이너스.

제한:

총 3번 기회니까 시간 복잡도는 충분하다.

풀기 전 생각:

스택, 문자열 변환

풀이 계획:

  1. 10이 있다면, 다른 문자열로 바꿔주기.
  2. stack, tmp 선언
  3. dartResult 돌면서,
    숫자라면 tmp에 넣고
    S,D,T중 하나라면 tmp에서 해당 연산 후 stack에 넣기
    *, # 라면
    * 라면 stack이 있다면, stack.pop()2해서 다시 넣은 후, tmp 4해서 넣기
    #라면 -tmp stack에 넣기
  4. sum(stack)리턴

풀이 코드

Python

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)

Javascript

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는 왼쪽부터 찾기 시작해서 처음 발견하는 것만 바꾼다.

코드의 깔끔함이 비교가 안된다...

profile
개발자로 취업하기

0개의 댓글