문제
https://programmers.co.kr/learn/courses/30/lessons/17682
처음 작성한 코드
def solution(dartResult):
import re
from collections import deque
score = []
su = deque(re.findall("(\d+)",dartResult))
while True:
if not dartResult: return sum(score)
s = su.popleft()
dartResult = dartResult[len(s):]
s = int(s)
b = dartResult[0]
dartResult = dartResult[1:]
if b == 'S': score.append(s)
elif b == 'D': score.append(s**2)
elif b == 'T': score.append(s**3)
if not dartResult: return sum(score)
if dartResult[0]=='*' or dartResult[0]=='#':
o = dartResult[0]
dartResult = dartResult[1:]
if o == '*':
if len(score)<2:
score[-1]*=2
else:
score[-1]*=2
score[-2]*=2
else:
score[-1]*=(-1)
return sum(score)
코드 리뷰 후
def solution(dartResult):
import re
bonus = {'S':1, 'D':2, 'T':3}
option = {'':1, '*':2, '#':-1}
dart = re.findall('(\d+)([SDT])([*#]?)',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]]
return sum(dart)
- findall()을 하면 dart라는 리스트에 ('숫자', 'S', '*') 이런식으로 또는 옵션이 없으면 ('숫자', 'S'. '') 이렇게 빈칸을 반환해준다.
- bonus는 제곱수니까 점수에 ** 하고 옵션은 2배거나 -1배니까 곱하기로 나타내서 dart를 재활용한다. 그리고 *가 나올 시 그 전 점수 2배 해주는 코드도 if문으로 해결했다.
깨달은 점
- 정규표현식은 정말 .. 이 문제에서 내가 뽑아야할 문자들이 (숫자)(S,D,T)(옵션으로 *,#) 였다. 즉 여기서 관건은 *나 #는 있으면 뽑고 없으면 안뽑는 그걸 어떻게 표현하는 지를 몰라서 한참 고민하다가 그냥 숫자만 뽑았다... 숫자는 자리수 관계없이 \d+ 이렇게 하면 되고 [SDT]는 뭐 당연한거고 [*#]? 이렇게 하면 있으면 뽑고 없으면 빈칸을 뽑아준다.. 대박!! '[]?' 이 표현식을 잘 기억해둬야겠다!
- 내가 처음 짠 코드는 모든 조건을 if 문으로 해결했는데 다른 사람이 짠 코드를 보니 dict()을 이용하여 아주 깔끔히 잘 풀었다... 대박~
'Programmers' 카테고리의 다른 글
[프로그래머스] 캐시 (0) | 2021.01.15 |
---|---|
[프로그래머스] 키패드 누르기 (0) | 2021.01.14 |
[프로그래머스] 비밀지도 (0) | 2021.01.13 |
[프로그래머스] 실패율 (0) | 2021.01.13 |
[프로그래머스] 튜플 (0) | 2021.01.11 |