카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
“점수|보너스|[옵션]”으로 이루어진 문자열 3세트.
예) 1S2D*3T
3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37
구글링해서 다른사람이 푼 것을 참고하여 코딩을 해봤다.
이 코드에서 써먹은 함수
1. substr
2. pow
3. stoi
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
int check_opt(string dartResult, int i)
{
if (i == dartResult.length())
return 1;
else if (dartResult[i + 1] == '*' || dartResult[i + 1] == '#')
return (dartResult[i + 1] == '*') ? 2 : -1;
else
return 1;
}
int solution(string dartResult) {
int answer = 0;
int current = 0;
int p = 0;
int score[3]{ 0, 0, 0 };
char opt;
for (int i = 0; i < dartResult.length(); i++)
{
if (dartResult[i] == 'S') p = 1;
else if (dartResult[i] == 'D') p = 2;
else if (dartResult[i] == 'T') p = 3;
if (p)
{
int tmp = stoi(dartResult.substr(0, i));
opt = check_opt(dartResult, i);
if (opt == 2 && current)
score[current - 1] *= 2;
score[current] = pow(tmp, p) * opt;
if (opt != 1) dartResult = dartResult.substr(i + 2);
else dartResult = dartResult.substr(i + 1);
current++;
i = 0;
p = 0;
}
}
answer = score[0] + score[1] + score[2];
return answer;
}
def pow(n, p):
if p == 'S':
return n
elif p == 'D':
return n * n
elif p == 'T':
return n * n * n
def solution(dartResult):
answer = 0
idx = -1
a = [0 for _ in range(3)]
size = len(dartResult)
i = 0
while i < size:
cur = dartResult[i]
if cur == 'S' or cur == 'D' or cur == 'T':
a[idx] = pow(a[idx], cur)
elif cur == '*':
if idx != 0:
a[idx - 1] *= 2
a[idx] *= 2
elif cur == '#':
a[idx] *= -1
else:
n = ord(cur) - ord('0')
if cur == '1' and dartResult[i + 1] == '0':
n = 10
i += 1
idx += 1
a[idx] = n
i += 1
for i in range(3):
print(a[i])
answer += a[i]
return answer
print(solution("1S2D*3T"))