문제에서 주어진 조건을 모두 만족시키는 총점을 리턴하는 문제이다.
조건이 너무 많아서 많이 헷갈렸다. 일단 코드다.
def solution(dr): lst = list(dr) for i in lst : if i == '*' : c = lst.index('*') if c == 2 or c == 3 : lst.insert(c+1,'d') lst.remove('*') dr = ''.join(lst) else : if dr[c-2] == '0' : lst.insert(c-3,'d') else : lst.insert(c-2,'d') lst.insert(c+1,'d') lst.remove('*') dr = ''.join(lst) dr1 = dr.replace('0','+0').replace('1','+1').replace('2','+2').replace('3','+3').replace('4','+4').replace('5','+5').replace('6','+6').replace('7','+7').replace('8','+8').replace('9','+9').replace('1+0','10') if dr1[0] == '+' : dr1 = dr1[1:] answer = eval(dr1.replace('S','**1').replace('D','**2').replace('T','**3').replace('d','*2').replace('#','*(-1)')) return answer
가볍게 생각하기로는 문자열을 계산해주는 함수
eval()
의 존재를 알고 있었기 때문에 조건들을 수식으로 변경해주면 끝날줄 알았다. 하지만 조건이 많이 까다로웠다.
첫번째 문제는
*
이었다.
별이 등장하는 장소에 따라 조건이 다르고, 두번째와 세번째에 등장하면 첫번째와 두번째에 곱셈을 추가해 주어야 했기에for문
안에 있는 코드는 이 조건을 해결하기 위해서 사용되었다.두번째 문제는
10
과0
의 존재였다.
이 두 숫자는 내 눈에는 다른 숫자인데, 다른 숫자라고 인식시킬수가 없었다. 그래서 궁여지책으로 처음에0
을replace('0','+0')
해주고 마지막에 다시한번replace('1+0','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
두번째
def solution(dartResult): point = [] answer = [] dartResult = dartResult.replace('10','k') point = ['10' if i == 'k' else i for i in dartResult] print(point) i = -1 sdt = ['S', 'D', 'T'] for j in point: if j in sdt : answer[i] = answer[i] ** (sdt.index(j)+1) elif j == '*': answer[i] = answer[i] * 2 if i != 0 : answer[i - 1] = answer[i - 1] * 2 elif j == '#': answer[i] = answer[i] * (-1) else: answer.append(int(j)) i += 1 return sum(answer)