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
'IT관련정보 > 카카오 코딩테스트 1차(2017년)' 카테고리의 다른 글
6. 프렌즈4블록(난이도: 상) - Python3.6.1 (0) | 2018.10.06 |
---|---|
5. 뉴스 클러스터링(난이도: 중) - Python3.6.1 (0) | 2018.10.06 |
4. 셔틀버스(난이도: 중) - Python3.6.1 (0) | 2018.10.06 |
3. 캐시(난이도: 하) - Python3.6.1 (0) | 2018.10.06 |
1. 비밀 지도(난이도: 하) - Python3.6.1 (0) | 2018.09.29 |