Lv1. [1차] 다트 게임

Hello·2022년 7월 24일
0

코딩테스트 연습 > [1차] 다트 게임

1. 풀이 설명

문제 내용을 그대로 코드로 옮겼다.

입력 받은 문자열, dartResult 를 한 글자씩 잘라서 처리했다.
두 자리인 10 처리를 위한 while문을 사용했다.

현재 점수에 제곱을 계산하는 S, D, T
마지막과 직전 점수를 2배로 만드는 *, 마지막 점수에 -1배를 하는 #
그리고 점수(정수)를 각각 처리했다.

중간 결과들을 arr 리스트에 저장했고, 최종적으로 리스트에 저장된 모든 값들의 합을 반환했다.


일반적으로 dartResult[idx+1] 와 같은 코드는 위험하다고 생각한다.
다만, 해당 문제에서는 점수(정수) 다음에 'S', 'D', 'T' 와 같은 문자가 항상 오기 때문에 IndexOutOfException 위험이 없다고 판단했다.

2. 나의 풀이

def solution(dartResult):
    arr = []
    num = 1

    idx = 0
    while idx < len(dartResult):
        c = dartResult[idx]
        if c == 'S':
            num = num ** 1
            arr.append(num)
        elif c == 'D':
            num = num ** 2
            arr.append(num)
        elif c == 'T':
            num = num ** 3
            arr.append(num)
        elif c == '*':
            arr[-1] = arr[-1]  * 2
            if len(arr) > 1:
                arr[-2] =  arr[-2]  * 2
        elif c == '#':
            arr[-1] = arr[-1] * (-1)
        else:
            if c == '1':
                if dartResult[idx+1] == '0':
                    num = 10
                    idx += 1
                else:
                    num = 1
            else:    
                num = int(c)
        idx += 1   
    
    return sum(arr)

3. 배운점

  1. modify list during for loop
for i, s in enumerate(arr):
    arr[i] = ...
  1. unindent does not match any outer indentation level들여쓰기 오류다.
  2. 문자열 처리에서 n개씩 잘라서 처리해야 하는 경우에는 while문 사용을 생각해보자.
  3. 정규식으로 푸는 방법도 있다.
profile
안녕하세요 :)

0개의 댓글