2018 KAKAO BLIND RECRUITMENT
[1차] 다트 게임
def solution(dart):
trial = [] # 3세트
# dart를 "점수|보너스|[옵션]"를 만족하는 3세트로 나눔
while True:
i = 0
if len(dart) <= 3:
break
if dart[i:i+2] == '10':
if dart[i+3] == '#' or dart[i+3] == '*':
print(dart[i:i+4])
trial.append(dart[i:i+4])
dart = dart.replace(dart[i:i+4], '')
else:
trial.append(dart[i:i+3])
dart = dart.replace(dart[i:i+3], '')
print(dart)
else:
if dart[i+2] == '#' or dart[i+2] == '*':
trial.append(dart[i:i+3])
dart = dart.replace(dart[i:i+3], '')
else:
trial.append(dart[i:i+2])
dart = dart.replace(dart[i:i+2], '')
if len(dart) != 0: # dart에 남아있는 문자열을 trial에 추가
trial.append(dart)
score = [0] * 3 # 점수
bonus = {'S': 1, 'D': 2, 'T': 3}
for i in range(len(trial)):
# *, #이 없고 점수가 10이 아님
if len(trial[i]) == 2:
score[i] = int(trial[i][0]) ** bonus[trial[i][1]]
# *, #이 있고 점수가 10이 아니거나 *, #이 없고 점수가 10임
elif len(trial[i]) == 3:
if "*" in trial[i]:
if i-1 >= 0:
score[i-1] *= 2
score[i] = int(trial[i][0]) ** bonus[trial[i][1]] * 2
elif "#" in trial[i]:
score[i] = int(trial[i][0]) ** bonus[trial[i][1]] * -1
else:
score[i] = int(trial[i][:2]) ** bonus[trial[i][2]]
# *, #이 있고 점수가 10임
else:
if "*" in trial[i]:
if i-1 >= 0:
score[i-1] *= 2
score[i] = int(trial[i][:2]) ** bonus[trial[i][2]]
else:
score[i] = int(trial[i][:2]) ** bonus[trial[i][2]] * -1
return sum(score)
풀긴 풀었는데 이게 맞는지 .. ㅠㅠ
#이나 *이 있으면 dart를 3개씩 자르고 없으면 2개씩 자르려고 했는데, 점수가 10인 경우가 복병이었다.
def solution(dartResult):
bonus = {'S' : 1, 'D' : 2, 'T' : 3}
option = {'' : 1, '*' : 2, '#' : -1}
p = re.compile('(\d+)([SDT])([*#]?)') # 숫자(\d+)와 보너스(S, D, T), 옵션(*, #)을 추출
dart = p.findall(dartResult) # dartResult 중 p와 일치하는 모든 부분 찾기
for i in range(len(dart)):
if dart[i][2] == '*' and i > 0: # 옵션이 *이고 이전 다트 결과가 있는 경우 처리
dart[i-1] *= 2
# 보너스와 옵션에 따라 가중치 적용
dart[i] = int(dart[i][0]) ** bonus[dart[i][1]] * option[dart[i][2]]
answer = sum(dart)
return answer
파이썬 | 정규 표현식(re) re.complie 사용을 위한 표현법 참고
def solution(dartResult):
point = []
answer = []
dartResult = dartResult.replace('10','k') # 10'을 'k'로 대체하여 더 쉽게 처리
point = ['10' if i == 'k' else i for i in dartResult] # 'k'를 다시 '10'으로 되돌림
print(point)
i = -1
sdt = ['S', 'D', 'T']
for j in point:
if j in sdt : S, D, T인 경우 해당 보너스에 따라 점수 계산
answer[i] = answer[i] ** (sdt.index(j)+1)
elif j == '*': # 옵션(*)인 경우
answer[i] = answer[i] * 2
if i != 0 :
answer[i - 1] = answer[i - 1] * 2
elif j == '#': # 옵션(#)인 경우
answer[i] = answer[i] * (-1)
else: # 숫자인 경우 정수로 변환하여 리스트에 추가
answer.append(int(j))
i += 1
return sum(answer)
10을 처리하기 위해 k를 사용하는 방법 👍
10 -> k -> 10으로 변환하는 과정을 거쳐야 list 안에 10을 담을 수 있다.
이 과정을 거치지 않으면 [10] 이 아니라 [1, 0]처럼 담기게 된다.
앞선 풀이보다 더 괜찮은 풀이 같다.