반응형
문제설명
https://programmers.co.kr/learn/courses/30/lessons/17682#
사고과정
- 문제가 스택을 활용해야 하는 듯한 문제인 게 감이 팍왔다.. 조건이 상당히 까다로웠다.. 시간이 좀 오래 걸리긴 했지만 구현에 성공했다...
- 중간에 많이 헤맨 부분이 잘 구현했는데 *(스타상) 일 때, 스택에서 뽑아낸 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)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[프로그래머스] 나누어 떨어지는 숫자 배열 (0) | 2021.12.09 |
---|---|
[프로그래머스] 같은 숫자는 싫어 (0) | 2021.12.09 |
[프로그램스] 가운데 글자 가져오기 (0) | 2021.12.08 |
[프로그래머스] 비밀지도 (0) | 2021.12.08 |
[프로그래머스] 부족한 금액 계산하기 (0) | 2021.12.08 |