문제

문제

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

 

처음 작성한 코드

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)
  1. findall()을 하면 dart라는 리스트에 ('숫자', 'S', '*') 이런식으로 또는 옵션이 없으면 ('숫자', 'S'. '') 이렇게 빈칸을 반환해준다.
  2. 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