본 내용은 하루 활동한 내용을 기록하기 위한 게시물입니다.
카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
어떤 방법을 사용할지 고민하다가 점수와 보너스, 옵션를 각각의 리스트로 만들어서 보너스와 옵션에 맞도록 점수 리스트를 만들어서 마지막에 합산하는 방법을 선택함
그래서 정규표현식을 통해서 점수, 보너스, 옵션을 분리해서 튜플 형태로 만들어서 사용함
import re
def cal(num, opt):
if opt == 'S':
return num ** 1
elif opt == 'D':
return num ** 2
elif opt == 'T':
return num ** 3
def solution(dartResult):
scores = []
options = []
# 점수와 보너스, 옵션을 한 번에 추출
parts = re.findall('(\d+)([SDT])([*#]?)', dartResult)
for score, bonus, option in parts:
scores.append(cal(int(score), bonus))
options.append(option if option else ' ')
result = 0
for i in range(len(options)):
if options[i] == '*':
scores[i] *= 2
if i > 0:
scores[i-1] *= 2
elif options[i] == '#':
scores[i] *= -1
return sum(scores)
다른 사람 풀이인데, 정규표현식을 사용하지 않아서 코드가 상당히 길어짐
정규표현식 자체를 계속 외우고 있기 어렵기 때문에 아래와 같은 방법도 알아두는 게 좋을 것 같음
정규표현식의 사용 여부만 다르고 마지막에 점수를 합치는 방법은 같음
def bonus(num, bonus_num):
if bonus_num == 'S':
return num ** 1
elif bonus_num == 'D':
return num ** 2
else:
return num ** 3
def solution(dartResult):
answer = 0
answer_list = [0]
score = []
for char in dartResult:
if char.isdigit():
if score:
if len(score) == 2:
result1 = bonus(int(score[0]), score[1])
answer_list.append(result1)
score = []
elif len(score) == 3:
result1 = bonus(int(score[0]), score[1])
if score[2] == '*':
answer_list[-1] *= 2
answer_list.append(result1 * 2)
elif score[2] == '#':
answer_list.append(result1 * (-1))
score = []
if len(score) > 0 and score[-1].isdigit():
score[-1] = int(score[0])* 10 + int(char)
score[-1] = str(score[-1])
else:
score.append(char)
else:
score.append(char)
if score:
if len(score) == 2:
result1 = bonus(int(score[0]), score[1])
answer_list.append(result1)
elif len(score) == 3:
result1 = bonus(int(score[0]), score[1])
if score[2] == '*':
answer_list[-1] *= 2
answer_list.append(result1 * 2)
elif score[2] == '#':
answer_list.append(result1 * (-1))
return sum(answer_list)
제출한 이력서에 대한 피드백을 받을 예정
길면 이틀 정도 소요된다고 해서 내일이면 받을 것 같음
피드백 받은 내용을 기반으로 이력서를 수정할 예정
오늘은 2018년 카카오 블라인드 테스트에서 나온 문제를 품
레벨1이긴 하지만 생각보다 어려웠음
하지만 정답률이 높은 걸 보니 그리 어려운 문제에 속하지 않는 것 같음
그렇기에 너무 급하지 않게 꾸준히 문제를 풀면서 레벨을 올려야겠음