본문 바로가기

알고리즘 삽질장

[프로그래머스] 다트 게임

반응형


문제설명

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

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

사고과정

  • 문제가 스택을 활용해야 하는 듯한 문제인 게 감이 팍왔다.. 조건이 상당히 까다로웠다.. 시간이 좀 오래 걸리긴 했지만 구현에 성공했다...
  • 중간에 많이 헤맨 부분이 잘 구현했는데 *(스타상) 일 때, 스택에서 뽑아낸 2개의 데이터를 다시 넣어줄 때 뽑아낸 순서 반대로 넣어줬어야 했는데 뽑아낸 순서대로 넣어주어서 테스트 케이스에서 자꾸 오류를 발생시켰다.. 그래도 디버깅해서 다행이다.. 스택에서 빼고 넣어줄 때 순서에 유의해야겠다!

풀이

def solution(dartResult):
    stack1 = []  # 숫자넣기
    stack2 = []  # 보너스 넣기

    for x in dartResult:
        if x.isnumeric():
            if int(x) == 0 and stack1 and stack1[-1] == 1:
                stack1.pop()
                stack1.append(10)
            elif not stack1 or not stack2: # 숫자or보너스 스택 비어있으면 바로 append
                stack1.append(int(x))
            elif stack2:
                bonus = stack2.pop() # 보너스 연산 pop
                score = stack1.pop() # 보너스 적용할 점수
                if bonus == 'S':
                    stack1.append(score)
                elif bonus == 'D':
                    stack1.append(score ** 2)
                elif bonus == 'T':
                    stack1.append(score ** 3)
                stack1.append(int(x))
        if x in ['S', 'D', 'T']:
            stack2.append(x)
        if x in ['*', '#']:
            bonus = stack2.pop() # 보너스 연산부터 처리
            score = stack1.pop() # 보너즈 적용할 점수
            if bonus == 'S':
                stack1.append(score)
            elif bonus == 'D':
                stack1.append(score ** 2)
            elif bonus == 'T':
                stack1.append(score ** 3)
            # 옵션 연산처리
            if x == '*':
                if len(stack1) == 1:  # 처음에 *가 등장했을 경우
                    score1 = stack1.pop()
                    stack1.append(score1 * 2)
                else:
                    score1 = stack1.pop()
                    score2 = stack1.pop()
                    stack1.append(score2 * 2)
                    stack1.append(score1 * 2)
            elif x == '#':
                score1 = stack1.pop()
                stack1.append(-score1)
    # 연산 스택에 남아있는 거 처리)
    if len(stack2) == 0:
        return sum(stack1)
    elif stack2[-1] in ['S', 'D', 'T']:
        bonus = stack2.pop()
        score = stack1.pop()
        if bonus == 'S':
            stack1.append(score ** 1)
        elif bonus == 'D':
            stack1.append(score ** 2)
        elif bonus == 'T':
            stack1.append(score ** 3)
        return sum(stack1)
반응형