프로그래머스 - [1차] 다트 게임

박상진·2022년 1월 13일
0

프로그래머스

목록 보기
42/65

자세한 설명은 링크 참고

문제에서 주어진 조건을 모두 만족시키는 총점을 리턴하는 문제이다.

조건이 너무 많아서 많이 헷갈렸다. 일단 코드다.

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문안에 있는 코드는 이 조건을 해결하기 위해서 사용되었다.

두번째 문제는 100의 존재였다.
이 두 숫자는 내 눈에는 다른 숫자인데, 다른 숫자라고 인식시킬수가 없었다. 그래서 궁여지책으로 처음에 0replace('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)
profile
개발자가 되고싶당

0개의 댓글