#문제링크
https://programmers.co.kr/learn/courses/30/lessons/17682?language=python3#
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
#나의풀이
def solution(dartResult):
answer = 0
stack = []
for i in range(len(dartResult)):
if dartResult[i].isdigit():
if dartResult[i] == '1' and dartResult[i+1] == '0':
stack.append(10)
i = i + 2
elif dartResult[i] == '0' and dartResult[i-1] == '1':
pass
else:
stack.append(int(dartResult[i]))
continue
if dartResult[i] == 'S':
tmp = stack.pop()
tmp **= 1
stack.append(tmp)
elif dartResult[i] == 'D':
tmp = stack.pop()
tmp **= 2
stack.append(tmp)
elif dartResult[i] == 'T':
tmp = stack.pop()
tmp **= 3
stack.append(tmp)
elif dartResult[i] == '*':
if len(stack) == 1:
tmp = stack.pop()
tmp *= 2
stack.append(tmp)
else:
current = stack.pop()
prev = stack.pop()
current *= 2
prev *= 2
stack.append(prev)
stack.append(current)
elif dartResult[i] == '#':
tmp = stack.pop()
tmp = -tmp
stack.append(tmp)
else:
for x in stack:
answer += x
return answer
#해설
아주 쉬운 구현문제였고 여러가지 고민하다가 스택으로 쉽게 풀릴꺼 같아 스택으로 풀게되었다.
1. 먼저 숫자인지 파악후 숫자일경우 스택에 그냥 넣어준다. 이때 for문으로 검사하는데 1자리씩만 파악 가능하므로 10일경우에는 1과 0이 스택으로 들어가는 현상이 생긴다. 이를 방지하고자 값이 1일경우 뒤에까지 확인해 0이면 10을 넣고 값이 0인데 앞이 1이 나올경우 이미 값을 넣어줬으므로 패스하여 다시 들어가는 일이 없도록 방지했다.
2. 이후 현재 자리가 문자일경우에는 각 문자마다의 특성대로 값을 만들어주었다. 이 부분에서는 특별히 조심할것이 없는거 같다. 사실 S일때는 ** 1이므로 코드를 안만들어줘도 될꺼 같다.
#여담
나름 이해하기 쉽고 깔끔하게 맞춰서 만들었다 생각했는데 다른사람풀이를 보니까 엄청 짧은 코드들이 많은거 같다.
또한 일단 주어진 값 0 ~ 10일때로 만들어놨긴 하지만 0 ~ 20일 경우 꽤 많이 고쳐야한다. 여러가지 반성하게 되는거 같다.
'코딩테스트' 카테고리의 다른 글
[프로그래머스/LEVEL 1/파이썬] 실패율 (0) | 2022.06.27 |
---|---|
[프로그래머스/LEVEL 1/파이썬] 숫자 문자열과 영단어 (0) | 2022.06.19 |
[백준/파이썬] 11005 진법 변환2 (0) | 2022.06.17 |
[백준/파이썬] 2745 진법 변환 (0) | 2022.06.17 |
[백준/파이썬] 16506 CPU (0) | 2022.06.16 |