본문 바로가기

알고리즘

프로그래머스)[1]차 다트 게임-pyhton

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

import re

def solution(dartResult):
    answer = 0
    dart = re.split('([*,#,S,D,T])',dartResult)
    stack = []
    num = 0
    for i in dart:
        if i.isdigit():
            num = int(i)
            
        elif i in ['*','#']:
            if i == '*':
                stack[-1] = stack[-1] * 2
                if len(stack) >= 2:
                    stack[-2] = stack[-2] * 2
            elif i == '#':
                stack[-1] = stack[-1] * -1
        
        elif i in ['S','D','T']: 
            if i =='S':
                num = num ** 1
            elif i == 'D':
                num = num ** 2
            elif i == 'T':
                num = num ** 3
            stack.append(num)
    print(stack)
    answer = sum(stack)
    return answer

 

해당 문제를 코드 그대로 구현하면 정답이 된다.

다만 점수가 1~10점인 제한이 있어

그냥 for i in dartResult를 하게된다면, 10s인 경우 1,0,s가 되므로 정규화를 이용하

'10','s'로 나누어야 된다.

정규화는 아래 문제 풀이를 통해 이미 학습한 바 있다.

https://junheelab.tistory.com/38

 

프로그래머스)수식 최대화-pyhton

 

junheelab.tistory.com

 

하지만 문제를 통과한 이후, 좀 더 간단하고 짧에 코드를 적을 수 있을 것 같은데...하는 생각에 검색을 해보았다.

def solution(dartResult):
    stack = []
    dartResult = dartResult.replace("10", "A")
    bonus = {'S': 1, 'D': 2, 'T': 3}
    
    for i in dartResult:
        if i.isdigit() or i=='A':
            stack.append(10 if i == 'A' else int(i))
        elif i in ('S', 'D', 'T'):
            num = stack.pop()
            stack.append(num ** bonus[i])
        elif i == '#':
            stack[-1] *= -1
        elif i == '*':
            num = stack.pop()
            if len(stack):
                stack[-1] *= 2
            stack.append(2 * num)
    return sum(stack)

아래 코드가 그나마 제일 짧은 코드였고 나머지는 내가 푼 코드와 다를게 없었다.