[1차] 다트 게임
문제는 위의 링크에서 확인이 가능하며, 입출력의 예시는 아래와 같다.
Solution 1:
#new 배열 정의 및 10을 @으로 대체한 방법
def dart(dartResult):
answer = 0
if "10" in dartResult:
dartResult = dartResult.replace("10","@")
new = []
for i in dartResult:
if i == "S":
i = new[-1]**(1)
new.pop()
if i == "D":
i = new[-1]**(2)
new.pop()
if i == "T":
i = new[-1]**(3)
new.pop()
if i == "*":
i = new[-1]*2
if len(new)>1:
new[-2] = new[-2]*2
new.pop()
if i == "#":
i = new[-1]*(-1)
new.pop()
if i == "@":
i = 10
new.append(int(i))
for i in new:
answer += i
return answer
Solution 2:
#정규 표현식을 사용한 방법
import re #정규표현식
def Solution(dartResult):
shot = re.findall(r'\d{1,2}[SDT][*#]?', dartResult)
#findall: 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
#1D2S3T*의 경우 "1D", "2S", "3T*"으로 잘리게 됨
opt = [1,1,1]
for i, s in enumerate(shot):
if s[-1] == '#': #맨 뒤가 #이면
opt[i] *= -1 #opt의 i번째 수 -1 곱하기
shot[i] = shot[i][:-1] #[:-1]: 맨 오른쪽 값을 제외하고 모두
elif s[-1] == '*': #맨 뒤가 #이면
opt[i] *= 2 #opt의 i번째 수 2 곱하기
shot[i] = shot[i][:-1]
if i:
opt[i-1] *= 2
point = [(int(s[:-1]) ** '0SDT'.find(s[-1]) * o) for s, o in zip(shot, opt)]
#zip(*iterable)은 shot와 opt를 묶어 주는 역할
return sum(point)
#정규표현현식 설명
r'\d{1,2}[SDT][*#]?'
\d : \d는 문자가 숫자이면 리턴
\d?\d: 0부터 10까지의 숫자를 찾을 수 있다.
[SDT]: 문자가 S거나 D거나 T일때 리턴
\d?\d: 1S ,1D , 10T 등 리턴 가능
[*#]?': 끝글자가 "#"거나 "*"일경우, 아니면 아무것도 없을 경우를 리턴
Github: github.com/sokim0991/python-study/blob/master/Kakao_%EB%8B%A4%ED%8A%B8%20%EA%B2%8C%EC%9E%84.ipynb
'Python > PS in Python' 카테고리의 다른 글
LeetCode 1351. Count Negative Numbers in a Sorted Matrix - Python (0) | 2020.10.21 |
---|---|
LeetCode 771. Jewels and Stones - Python (0) | 2020.10.19 |
[1차] 비밀지도 : 코딩테스트 연습 / Python / Programmers / Level1 (0) | 2020.10.09 |
LeetCode 581. Shortest Unsorted Continuous Subarray - Python (0) | 2020.09.22 |
LeetCode 20. Valid Parentheses - Python (0) | 2020.09.21 |
댓글