Array ( )
1번 문제에 이어 2번 문제로 넘어가 보겠습니다.
저는 우선 개인적으로 이렇게 회사의 컨텐츠와 연관지어 내는 문제들을 좋아합니다. 문제를 위한 억지 상황보다 훨씬 자연스럽고 이해 하기도 쉽기 때문입니다. 문제를 요약하자면 다트 결과가 문자열 배열로 날아오는데, 이를 적절히 처리해서 점수를 구하는 문제가 됩니다.
확실히 우리가 이용할 수 있는 규칙은 점수|보너스|[옵션] 으로 주어진 패턴이기 때문에, 1번째 파싱에선 반드시 숫자를 얻을 수 있고, 2번째에선 보너스를, 그리고 3번째에서는 숫자가 나오면 옵션이 없는 것이고, 문자열이 또 나온다면 옵션이 있는 것으로 유추할 수 있습니다.
이를 이용하여 문자열이 끝날 때까지 계산을 하면 되는 문제입니다. 몇가지 유의할 점은, 아차상에서는 현재 점수와 이전 점수의 2배를 얻을 수 있기 때문에, 이전 점수를 기록해 놓는 것이 중요합니다. 본문에서 나오는 아차상이 스타상과 중첩이 될 수 있다고 하는 부분이 바로 이런 경우입니다. 문제의 리턴 타입이 명시되어 있지 않지만, 10T*10T*... 라고 해도 int 범위를 넘을 것 같진 않아 int로 진행하겠습니다. 저 같은 경우 문제를 풀 때는 어지간하면 long long을 기본으로 두고 풉니다. 이러면 혹시나 범위가 초과되어 오답이 생기는 일을 원천봉쇄 할 수 있기 때문이죠.
int solve(string dartResult)
{
int ans = 0, prev = 0, score = 0;
bool isFinish = false;
for (char c : dartResult)
{
if ('0' <= c && c <= '9')
{
if (isFinish)
{
ans += score;
prev = score;
score = 0;
isFinish = false;
}
score = score * 10 + c - '0';
continue;
}
else if ('A' <= c && c <= 'Z')
{
isFinish = true;
if (c == 'D') score = score * score;
else if (c == 'T') score = score * score * score;
}
else
{
if (c == '*')
score += prev + score;
else
score *= -1;
}
}
ans += score;
return ans;
}