기록
[Python] 다트 게임 본문
반응형
programmers.co.kr/learn/courses/30/lessons/17682
간단한 게임을 만드는 문제입니다.
def solution(dartResult):
answer = 0
idx = 0
prevNum = 0
num = 0
ten = False
for i in range(len(dartResult)):
if dartResult[i].isdigit():
if ten == True:
continue
idx = 0
if dartResult[i+1] == '0':
ten = True
# 중첩스타상 당할 수 있음으로 prevNum을 더함
answer += prevNum
prevNum = num
if ten == True:
num = 10
else :
num = int(dartResult[i])
if idx == 1:
ten = False
if dartResult[i] == 'S':
num **= 1
elif dartResult[i] == 'D':
num **= 2
elif dartResult[i] == 'T':
num **= 3
# 스타상, 아치상
if idx == 2:
if dartResult[i] == '*':
prevNum *= 2
num *= 2
elif dartResult[i] == '#':
num *= -1
idx += 1
answer += prevNum + num
return answer
처음에는 for s in dartResult 로 문자를 하나씩 검사하는 방식으로 시도했는데 테스트케이스 4, 5, 6, 7에서 에러가 났습니다.
나중에 알고보니 10을 간과해서 발생한 문제였기에 인덱스를 참조하는 방식으로 바꾼 후, 숫자가 1인 경우에는 다음 숫자를 검사하여 1일 경우와 10일 경우로 케이스를 나눠줬습니다.
그리고 스타상이 중첩해서 발생할 수 있음으로, 반복문이 최소 2세트를 검사한 이후부터 answer를 더해주기 시작했습니다.
def solution(dartResult):
dart_result = dartResult.replace('10','a')
num = list(map(str, range(0, 10))) + ['a']
bonus = {'S':1, 'D':2, 'T':3}
opt = ['*', '#']
score = []
for i in range(len(dart_result)):
if dart_result[i] in num:
if dart_result[i] == 'a':
score.append(10)
else:
score.append(int(dart_result[i]))
elif dart_result[i] in bonus:
score[-1] **= bonus[dart_result[i]]
elif dart_result[i] in opt:
if dart_result[i] == '*':
if len(score) == 1:
score[-1] *= 2
else:
score[-2], score[-1] = score[-2] * 2, score[-1] * 2
elif dart_result[i] == '#':
score[-1] = -score[-1]
answer = sum(score)
return answer
리스트와 딕셔너리를 적극 활용한 풀이입니다.
예외값인 '10'을 처리하기 위해 인자값으로 들어온 dartResult의 '10'을 'a'로 치환하여 새로운 dart_result 리스트를 만들었습니다.
그 후, dart_result의 값을 순차적으로 검사하여 값이 num 리스트에 들어있을 경우, bonus 리스트에 들어있을 경우, opt 리스트에 들어있을 경우에 따라 로직을 나눠줬어요.
훨씬 더 파이썬다운 풀이네요. 이 외에도 정규표현식을 이용한 방법이 있습니다.
파이썬에 빨리 익숙해져야겠습니다.
반응형
'[Study] > 코딩테스트 연습' 카테고리의 다른 글
[Python] 3진법 뒤집기 (0) | 2020.11.07 |
---|---|
[Python] 비밀지도 (0) | 2020.11.07 |
[JAVA] 백준 11053 가장 긴 증가하는 부분 수열 (0) | 2020.10.10 |
[Python] 프로그래머스 level2 - 큰 수 만들기 (0) | 2020.10.08 |
분할정복으로 1부터 n까지 합 구하기 (0) | 2020.07.23 |