본문 바로가기
Python/PS in Python

[1차] 다트 게임 : 코딩테스트 연습 / Python / Programmers / Level1

by Air’s Big Data 2020. 10. 16.

[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

 

댓글