[algorithm][python] 프로그래머스 다트게임

oznni·2021년 6월 27일
0
post-thumbnail

문제

2018 KAKAO BLIND RECRUITMENT | 다트게임

문제 풀이

def solution(dartResult):
    num = "" # 해당 영역의 숫자를 완성하기 위해 사용하는 변수
    score = [] # 세번의 기회에서의 점수를 저장하는 리스트
    sdt = {'S' : 1, 'D' : 2, 'T' : 3} # S, D, T 영역의 점수계산 방식을 저장 (S, D, T가 key!, key를 인덱스로 사용)

    for dart in dartResult:
        if dart.isdigit(): # 숫자인 경우
            num += dart

        elif dart == "*": # 스타상인 경우
            if len(score) == 1: # 첫번째 스타상의 점수만 2배가 된다.
                score[0] *= 2
            else: # 이전점수와 해당 점수를 2배가 된다.
                score[-2] *= 2
                score[-1] *= 2

        elif dart == "#": # 아차상인 경우
            score[-1] *= -1 #  해당 영역의 점수는 마이너스 된다.

        else: # S D T 중에 하나인 경우
            score.append(int(num) ** sdt[dart])
            num = ""
    return sum(score)

print(solution("1S2D*3T")) # 테스트 코드
  1. 딕셔너리를 이용해서 S, D, T 영역의 점수계산 방식(n제곱)을 저장함
  2. for문에서 dartResult 리스트의 원소를 검사
    2.1 원소가 숫자인 경우 num에 추가
    2.2 원소가 "*" 인 경우
    2.2.1 "*"이 첫번째 영역에 등장한 경우
    2.2.2.1 첫번째 점수를 2배로 함
    2.2.2 "*"이 두세번째 영역에 등장한 경우
    이전 점수(-2)와 해당점수(-1)를 2배로 한다.
    2.3 원소가 "#"인 경우
    2.3.1 해당 번째의 점수를 마이너스 함
    2.4 원소가 S D T 중에 하나인 경우
    2.4.1 S D T 이전에는 무조건 숫자가 등장되고 num이 완성된다. 따라서 num에 해당영역의 점수계산 방식에 따라 n제곱한 값을 score에 추가한다. (해당 영역의 점수를 저장)
    2.4.2 해당 영역의 num이 완성됐으므로 다음 영역의 숫자를 구하기위해 num을 공백으로 초기화 한다.

개인적으로 지금까지 풀었던 문제(몇 안되지만)중에 가장 재밌었던 문제였다!!

새롭게 알게된 점

처음에 else 부분에서 아래와 같이 S D T인 경우를 각각 나눠서 점수를 계산했었다.

else:
    if dartResult[i] == "S":
        score.append(int(num) ** 1)
    elif dartResult[i] == "D":
        score.append(int(num) ** 2)
    else:
        score.append(int(num) ** 3)
    num = ""

근데 다른 사람의 풀이를 보니 딕셔너리로 간단히 계산할 수 있는 것을 알게되었다. 아래와 같이 S, D, T 영역을 키로 하여 n제곱(점수계산방식)을 저장하는 것이다.

sdt = {'S' : 1, 'D' : 2, 'T' : 3}

사실 딕셔너리를 자주 사용하지 않아서 익숙하지 않았는데, 이번 기회로 로또의 최고순위와 최저순위 문제에 딕셔너리를 적용해서 쉽게 풀 수 있었다.

   		
profile
Android Developer.

0개의 댓글

관련 채용 정보