[Python][프로그래머스 Lv.1] [1차] 다트 게임

1jinju·2023년 9월 12일
0

프로그래머스

목록 보기
4/14

2018 KAKAO BLIND RECRUITMENT
[1차] 다트 게임

def solution(dart):
    trial = [] # 3세트
    
    # dart를 "점수|보너스|[옵션]"를 만족하는 3세트로 나눔
    while True:
        i = 0
        if len(dart) <= 3:
            break
        if dart[i:i+2] == '10':
            if dart[i+3] == '#' or dart[i+3] == '*':
                print(dart[i:i+4])
                trial.append(dart[i:i+4])
                dart = dart.replace(dart[i:i+4], '')
            else:
                trial.append(dart[i:i+3])
                dart = dart.replace(dart[i:i+3], '')
                print(dart)
        else:
            if dart[i+2] == '#' or dart[i+2] == '*':
                trial.append(dart[i:i+3])
                dart = dart.replace(dart[i:i+3], '')
            else:
                trial.append(dart[i:i+2])
                dart = dart.replace(dart[i:i+2], '')
    if len(dart) != 0: # dart에 남아있는 문자열을 trial에 추가
        trial.append(dart)
        
    score = [0] * 3 # 점수
    bonus = {'S': 1, 'D': 2, 'T': 3}
    for i in range(len(trial)):
    	# *, #이 없고 점수가 10이  아님
        if len(trial[i]) == 2:
            score[i] = int(trial[i][0]) ** bonus[trial[i][1]]
        # *, #이 있고 점수가 10이 아니거나 *, #이 없고 점수가 10임
        elif len(trial[i]) == 3:
            if "*" in trial[i]:
                if i-1 >= 0:
                    score[i-1] *= 2
                score[i] = int(trial[i][0]) ** bonus[trial[i][1]] * 2
            elif "#" in trial[i]:
                score[i] = int(trial[i][0]) ** bonus[trial[i][1]] * -1
            else:
                score[i] = int(trial[i][:2]) ** bonus[trial[i][2]]
        # *, #이 있고 점수가 10임
        else:
            if "*" in trial[i]:
                if i-1 >= 0:
                    score[i-1] *= 2
                score[i] = int(trial[i][:2]) ** bonus[trial[i][2]]
            else:
                score[i] = int(trial[i][:2]) ** bonus[trial[i][2]] * -1
    return sum(score)

풀긴 풀었는데 이게 맞는지 .. ㅠㅠ
#이나 *이 있으면 dart를 3개씩 자르고 없으면 2개씩 자르려고 했는데, 점수가 10인 경우가 복병이었다.

다른 사람의 풀이

def solution(dartResult):
    bonus = {'S' : 1, 'D' : 2, 'T' : 3}
    option = {'' : 1, '*' : 2, '#' : -1}
    p = re.compile('(\d+)([SDT])([*#]?)') # 숫자(\d+)와 보너스(S, D, T), 옵션(*, #)을 추출
    dart = p.findall(dartResult) # dartResult 중 p와 일치하는 모든 부분 찾기
    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

파이썬 | 정규 표현식(re) re.complie 사용을 위한 표현법 참고

def solution(dartResult):
    point = []
    answer = []
    dartResult = dartResult.replace('10','k') # 10'을 'k'로 대체하여 더 쉽게 처리
    point = ['10' if i == 'k' else i for i in dartResult] # 'k'를 다시 '10'으로 되돌림
    print(point)

    i = -1
    sdt = ['S', 'D', 'T']
    for j in point:
        if j in sdt : S, D, T인 경우 해당 보너스에 따라 점수 계산
            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)

10을 처리하기 위해 k를 사용하는 방법 👍
10 -> k -> 10으로 변환하는 과정을 거쳐야 list 안에 10을 담을 수 있다.
이 과정을 거치지 않으면 [10] 이 아니라 [1, 0]처럼 담기게 된다.

앞선 풀이보다 더 괜찮은 풀이 같다.

profile
아자잣

0개의 댓글