알고리즘 문제풀이/프로그래머스
[Seop's의 코드풀이] 프로그래머스 2018 KAKAO BLIND RECRUITMENT [1차] 다트게임 - Python
섭섭군
2020. 5. 3. 13:38
반응형
이번에 풀어볼 문제는 2018년도 카카오 블라인드 채용 코딩테스트에 나왔던
다트게임이라는 문제입니다. 문제의 내용은 다음과 같습니다.
https://programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제를 요약해 보면 다음과 같다.
1. 문자열은 3개의 점수 구성으로 이루어져 있다.
2. 각각의 숫자의 점수다음에 붙는 S, D, T 는 점수^1, 점수^2, 점수^3을 취하는 조건이다.
3. * 과 #의 옵션이 존재 할 수도 있으며 *은 본 점수와 이전 점수에 2배, #은 본 점수에 -1배를 취한다.
점수를 부여하는 과정은 그렇게 까다롭지 않았지만
한 문자열을 3개로 나누는 작업에서 좀 해매었습니다.
저는 3개의 점수로 나누는 과정을 다음과 같은 방식으로 진행했습니다.
스택을 만들어 숫자 이외의 것들을 저장시킨다.
temp 변수에는 나누게 될 문자열의 시작값을 저장시킨다.
문자열을 탐색해 숫자가 나오고 스택이 비어있지 않다면 문자열[temp : i]의 값을 분류하고 저장한다.
이러한 방법으로 숫자와 다른 문자가 있는 것을 구분하여 진행하였습니다.
점수를 계산 하는 과정은 if 문을 통하여 진행하였습니다.
전체적인 코드는 다음과 같습니다.
피드백과 질문은 언제나 감사드립니다.
def solution(dartResult):
answer = [0,0,0]
score_list = []
tmep = 0
stack = []
# 문자열을 3개로 나누는 작업
for i in range(1, len(dartResult) - 1 ) :
if dartResult[i] >= "0" and dartResult[i] <= "9" :
if stack :
score_list.append(dartResult[tmep : i])
tmep = i
stack = []
else :
stack.append(dartResult[i])
score_list.append(dartResult[tmep : ])
# 나눈 문자열을 조건에 따라 점수를 부여하는 작업
for s in range(3) :
num_buf = ''
bonus = 0
option = []
for i in score_list[s] :
if i >= '0' and i <= '9' :
num_buf += i
elif i == "S" :
bonus = 1
elif i == "D" :
bonus = 2
elif i == "T" :
bonus = 3
elif i == "#" :
option.append(-1)
elif i == "*" :
option.append(2)
# 점수와 bonus는 항상 존재하지만 option은 없을 수도 있기 때문에 배열에 저장
score = pow(int(num_buf), bonus)
if option :
# option이 # 인 경우는 -1을 곱하고 *인 경우는 2를 본 점수와 이전 점수에 곱한다.
if option[0] == -1 :
score = score*-1
else :
if s > 0 :
answer[s-1] = answer[s-1]*2
score *= 2
answer[s] = score
return sum(answer)
print(solution("1S2D*3T"))
반응형