문제
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 리스트에 포함된 값의 합을 리턴한다.
'python, pyTorch > 코딩테스트-파이썬' 카테고리의 다른 글
BOJ 설탕배달, 정수삼각형 (0) | 2022.02.13 |
---|---|
BOJ 가장긴증가하는부분수열, RGB거리 (0) | 2022.02.12 |
프로그래머스 Lv2. 주차 요금 계산 (0) | 2022.02.04 |
BOJ 결혼식, 계단오르기 (0) | 2022.02.02 |
프로그래머스 Lv1. 신규아이디추천 (2) | 2022.01.19 |