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

그냥·2022년 8월 10일
0

codetest

목록 보기
6/9

문제

[1차] 다트게임



조건 정리

1) 인자는 '1S2D*3T' 처럼 숫자+영어+(#*)로 조합된 문자열이다.
2) S, D, T 뒤에 #, *가 없다면 S, D, T에서 문자를 자른다. 있다면 #, *에서 문자를 자른다.
3) *일때 이전 점수와 현재 점수에 곱하기 2를 해준다.
4) #일때 현재 점수에만 곱하기 -1을 해준다.
5) 모든 수의 합을 반환한다.


내 풀이

import re

def solution(dartResult):
    answer = []
    num = re.findall(r'\d+', dartResult)
    num = [int(i) for i in num]
    char = re.findall('[a-zA-Z*#]+', dartResult)

    for n, c in zip(num, char):
        if c[0] == 'S':
            if c[-1] == '*':
                if answer != []: 
                    answer[-1] *= 2
                answer.append(n*2)
            elif c[-1] == '#':
                answer.append(-n)
            else:
                answer.append(n)
            print(answer)
        if c[0] == 'D':
            if c[-1] == '*':
                if answer != []: 
                    answer[-1] *= 2
                answer.append(n**2*2)
                print(answer)
            elif c[-1] == '#':
                answer.append(-n**2)
            else:
                answer.append(n**2)
        if c[0] == 'T':
            if c[-1] == '*':
                if answer != []: 
                    answer[-1] *= 2
                answer.append(n**3*2)
            elif c[-1] == '#':
                answer.append(-n**3)
            else:
                answer.append(n**3)
        
    return sum(answer)
  • num: 정규표현식으로 숫자부분만 가져와서 리스트 선언
  • char: 영어와 특수문자로 되어있는 부분만 가져와서 리스트 선언
  • 반복문: 'S', 'D', 'T'인 경우에 따라 조건을 달리하여 answer에 값을 append 해줌
  • answer의 합을 반환


다른 풀이

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

print(solution('1S2D*3T'))
  • bonus: bonus에 해당하는 문자열을 key로, 제곱이 되는 값을 value로 하여 dict 선언
  • option: option에 해당하는 문자열을 key로, 곱해주는 값을 value로 하여 dict 선언
  • p: (숫자) (SDT) (*#)에 해당 하는 값을 나누어 compile
  • dart: p에서 compile 한 부분에 대해서 dartResult에서 찾아 리스트로 반환
    (ex. [('1', 'S', ''), ('2', 'D', '*'), ('3', 'T', '')])
  • 반복문: dart에서 dart[i][2]고 i>0이면, 이전 값인 dart[i-1]에 2를 곱한다. 그리고 튜플로 되어있는 원소 값을 정수로 변환한다.
  • sum(dart): dart의 모든 값을 합해서 반환한다.

0개의 댓글