프로그래머스 LV.1 “[1차] 다트

주소:

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

프로그램 제작자

코드 중심 개발자를 고용하십시오. 배치 기반 위치 매칭. 프로그래머의 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.

Programmer.co.kr

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

시간 복잡도는 더 좋지 않습니다.

하지만 정규식 솔루션이 인상적이어서 가져왔습니다.

정규 표현식을 잘 사용한다면 혼합 문자열을 다룰 때 큰 이점이 될 것 같습니다.