주소:
https://school.programmers.co.kr/learn/courses/30/lessons/17682
2018 코코아 1차 블라인드 모집 문제
솔루션 프로세스:
def solution(dr):
cal = ()
dr = dr.replace("10", "A") #"10"은 두글자이므로 "A"로 바꿔 한글자로 치환
bonus = {'S': 1, 'D': 2, 'T': 3} #bouns dictionary
dart = () #각 다트의 점수를 넣을 list
for i in dr: #입력값 반복
if i.isdigit() or i == "A": #i가 숫자이거나 "A"면
dart.append(10 if i == "A" else int(i)) #A면 10을 아니면 int(i)를 dart배열에 넣기
elif i in bonus: #i가 bonus안에 있으면
dart(-1) = dart(-1) ** bonus(i) #마지막 받았던 숫자에 key값에 맞는 value를 제곱해줌
elif i == "*": #i가 "*"면
if len(dart) == 1: #dart의 길이가 1이라면 처음 숫자라는 뜻, 그러므로 그 자리에만 2를 곱해준다.
dart(0) = dart(0) * 2
else: #아니라면 뒤에 숫자까지 2를 곱해준다.
dart(-1) = dart(-1) * 2
dart(-2) = dart(-2) * 2
else: # "#"의 대한 처리
dart(-1) = dart(-1) * -1 #그 숫자를 음수처리 해준다.
return sum(dart)
문제를 설계하는 것은 쉬웠습니다.
가장 어려운 점은 입력 값에 상수 10이 포함되어 있지만 루프 문은 잘린 후 1과 0을 반환한다는 것입니다.
그래서 A를 10으로 바꾸는 아이디어가 가장 어려웠다.
다른 사람의 솔루션:
import re
def solution(dartResult):
bonus = {'S' : 1, 'D' : 2, 'T' : 3}
option = {'' : 1, '*' : 2, '#' : -1}
p = re.compile('(\d+)((SDT))((*#)?)')
dart = p.findall(dartResult)
for i in range(len(dart)):
if dart(i)(2) == '*' and i > 0:
dart(i-1) *= 2
dart(i) = int(dart(i)(0)) ** bonus(dart(i)(1)) * option(dart(i)(2))
answer = sum(dart)
return answer
시간 복잡도는 더 좋지 않습니다.
하지만 정규식 솔루션이 인상적이어서 가져왔습니다.
정규 표현식을 잘 사용한다면 혼합 문자열을 다룰 때 큰 이점이 될 것 같습니다.