본문 바로가기

IT관련정보/카카오 코딩테스트 1차(2017년)

2. 다트 게임(난이도: 하) - Python3.6.1

1.풀이방법


토큰화로 처리할 때는 정규표현식(re.findall)을 이용해 숫자와 문자를 나누어 처리하면 편리하다.


Single(S) = ^2

Double(D) = ^3

Triple(T) = ^4

스타상(*) = *2 or *2,*2

아차상(#) = -1


각각의 문자를 문자열로 된 수식어로 변환후(# -> -1) return 할때 문자열을 수식으로 계산 후 반환한다.


2.코드


import re


def Question2(dartResult):

    arr = re.findall('\d+\D+',dartResult) #1

    for i in range(3):

        if '*' in arr[i]:

            if i == 0: #2

                arr[i] += '2'

            else:

                arr[i] += '2'

                arr[i-1] += '*2'

        if 'S' in arr[i]: #3

            arr[i] = arr[i].replace('S','**1')

        if 'D' in arr[i]: #3

            arr[i] = arr[i].replace('D','**2')

        if 'T' in arr[i]: #3

            arr[i] = arr[i].replace('T','**3')

        if '#' in arr[i]: #3

            arr[i] = arr[i].replace('#','*(-1)')

    total = '+'.join(arr) #4

    return eval(total) #5


3.코드설명


예) dataResult = '1S2D*3T'

#1 정규표현식을 이용해 3번의 결과값을 분리한다. arr = ['1S','2D*','3T']

#2 첫 번째 점수에 아차상이 있을경우 첫 번째 점수만 *2, 두 번째 부터는 이전점수 *2 현재점수 *2를 해준다.

#3 나머지 문자(S,D,T,#)가 있을경우 해당 문자열수식값(**1,**2,**3,-1)으로 변경해준다.

#4 계산이 끝난 문자열수식어를 합쳐준다. ['1**1*2', '2**2*2', '3**3'] -> '1**1*2+2**2*2+3**3'

#5 문자열수식어를 수식으로 처리해서 반환한다. '1**1*2+2**2*2+3**3' -> 37


4.결과


>>> Question2('1S2D*3T')

37

>>> Question2('1D2S#10S')

9

>>> Question2('1D2S0T')

3

>>> Question2('1S*2T*3S')

23

>>> Question2('1D#2S*3S')

5

>>> Question2('1T2D3D#')

-4

>>> Question2('1D2S3T*')

59