문제 참고
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드 작성
def solution(dartResult): answer = 0 num = 0 count = -1 num_list = [0 for _ in range(3)] for r in dartResult: try: if float(r).is_integer(): if num == 1 and int(r) == 0: num = int(10) else: num = int(r) count += 1 except: if r == 'S': num = num ** 1 num_list[count] = num elif r == 'D': num = num ** 2 num_list[count] = num elif r == 'T': num = num ** 3 num_list[count] = num elif r == '*': if count >= 1: num_list[count - 1] = num_list[count - 1] * 2 num_list[count] = num * 2 else: num_list[count] = num * 2 else: num_list[count] = num * (-1) answer = sum(num_list) return answer
- 다트는 총 3번만 던지므로 3개의 숫자를 담는 num_list 배열 생성
- dartResult에 저장된 내용을 하나씩 확인한다.
- 만약 정수라면 num_list에 저장한다. 이때 10은 하나씩 읽는 것으로는 알 수 없으므로, 먼저 num에 1이 저장되어 잇는데
이후 읽은 숫자가 0이라면 10을 num에 저장한다.
count는 숫자가 몇 개 읽혔는지를 저장하는 변수이다. 이후 '*'에 의한 직전 숫자의 2배 적용 여부를 판단하기 위함이다.
- 만약 except가 발생한 경우라면 정수가 아니기 때문이다.
S, D, T에 따라서 num에 곱하는 수를 달리하고 이를 이전에 만든 배열 num_list에 새로이 저장한다.
- 만약 '*'이 읽어지는 경우에는 지금 다루고 있는 숫자와 바로 직전의 숫자에 대해서도 동일하게 처리를 진행한다.
count가 1이상인 경우만 숫자가 2개 이상 있는 것이다.
- 아무 case에도 해당하지 않는 경우에는 '#'이므로 -1을 곱한다.
- 마지막으로 num_list에 있는 숫자들을 모두 더하기만 하면 된다.
