python, pyTorch/코딩테스트-파이썬

프로그래머스 Lv1. 다트게임

zooyeonii 2022. 2. 12. 08:00

문제

input : '1S2D*3T' 

위와 같이 문자열로 입력된다.

1) 숫자는 0-10까지 가능하다. 나는 '10' 예외처리를 해주었다. 

2) 숫자 다음에 오는 문자 S, D, T는 각각 현재 값의 1제곱, 2제곱, 2제곱을 의미한다. 

3) S, D, T 다음에 오는 문자 *, # 에서 주의할 점이 있는데, 
#는 현재 값에 (-1)를 곱해주는 것이고, 
*는 현재 값과 이전 값에 2를 곱해주는 것이다. 특히 '*' 조건이 놓치지 쉽다. 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def solution(dart):
    answer = [0]
    ans = 0
    for i in range(len(dart)) :
        if 48<=ord(dart[i])<=57 :
            ans = int(dart[i])
            answer.append(ans)
            if int(dart[i])==0 and ord(dart[i-1])==49:
                ans = 10
                answer[-1= answer.pop()
                answer[-1= ans
 
        elif dart[i]=='D' or dart[i]=='S' or dart[i]=='T':
            if dart[i]=='D':
                answer[-1= ans**2
            elif dart[i]=='T':
                answer[-1= ans**3
            else:
                answer[-1= ans
        elif dart[i]=='*' or dart[i]=='#':
            if dart[i]=='*':
                answer[-1]*=2
                if answer[-2]:
                    answer[-2]*=2
            else:
                answer[-1]*=(-1)
 
    return sum(answer)
cs

설명

코드는 re 모듈을 사용하는 것이 제일 깔끔하다. 이전에 풀었던 '신규 아이디 추천 ' 처럼 구현하는 것인데, 

아직 re 사용이 미숙해서 위 코드는 if-elif-else문으로 작성했다. 

1. answer = [0] 으로 초기화 해준 이유는 idx 범위가 벗어남을 방지하기 위함이며, 계산 과정에 아무 영향을 미치지 않는다. 

2. 아스키 코드 48(=0)~57(=9) 까지, 즉 숫자가 입력되면 해당값을 answer 리스트에 추가한다. 

3. 숫자로 10이 들어올 수 있다는 걸 처음에 간과했다. '10'이 들어올 경우를 추가했다. 이때 그냥 answer[-1]=10으로 처리해주면 다음에 다시 '0'이 리스트에 추가될 수 있으므로, 아예 answer.pop()을 통해 이전 값 (1)을 삭제하고 다시 10을 추가한다. 

4. elif 문으로 S, D, T / *, #을 처리해주었다. '*'은 현재 값인 answer[-1] 외에도 answer[-2] (이전 값)을 2배로 한다. 

if answer[-2]: 로 처리하여, 이전 값이 존재하지 않는다면 실행하지 않는다. answer[0] = 0 이므로 이 또한 같은 결과가 나온다. 

5. 결과적으로 answer 리스트에 포함된 값의 합을 리턴한다.