https://school.programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
2018 KAKAO BLIND RECRUITMENT에 나온 문제입니다.
다트 게임의 점수 계산 로직을 만드세요.
조건
- 다트 게임은 총 3번의 기회로 구성된다.
- 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
- 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1 제곱, 2 제곱, 3 제곱 (점수 1 , 점수 2 , 점수 3 )으로 계산된다.
- 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다.
- 아차상(#) 당첨 시 해당 점수는 마이너스된다. 스타상(*)은 첫 번째 기회에서도 나올 수 있다.
- 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다.
- 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다.
- 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다.
- Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
- 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
풀이 방법
시키는 대로 구현하면 풀 수 있습니다.
문자열을 숫자 기준으로 파싱하고, S, D, T, *, #가 나오면 해당 규칙에 따라 파싱 한 숫자를 계산만 해주면 됩니다.
이때 현재 숫자의 위치(인덱스)를 기억하여 스타상(*)과 아차상(#)이 나올 때마다 해당 점수에 맞게 계산합니다.
조건에서는 중첩이라고 어렵게 써놨지만, 결국 각각 독립적으로 처리된다는 의미입니다.
즉, 스타상(*)과 아차상(#)은 서로 영향을 주지 않으므로 순서대로 계산하면 끝입니다.
풀이 코드
#include <string>
#include <vector>
using namespace std;
vector<int>nums;
int next_position, answer, tmp;
string tmps;
int string_to_int(string s);
int solution(string dartResult) {
for(char c : dartResult){
if(c == 'S'){
tmp = string_to_int(tmps);
nums.push_back(tmp);
next_position++;
continue;
}
else if(c == 'D'){
tmp = string_to_int(tmps);
nums.push_back(tmp*tmp);
next_position++;
continue;
}
else if (c == 'T'){
tmp = string_to_int(tmps);
nums.push_back(tmp*tmp*tmp);
next_position++;
continue;
}
else if (c == '*'){
if(next_position-2>=0) nums[next_position-2]*=2;
nums[next_position-1]*=2;
continue;
}
else if(c == '#'){
nums[next_position-1]*=-1;
continue;
}
tmps+=c;
}
for(int i : nums) answer+=i;
return answer;
}
int string_to_int(string s){
int i = 0;
if(s.size() == 1){
i = s[0] - '0';
}
else i = stoi(s);
tmps = "";
return i;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] Lv.3 금과 은 운반하기 c++ (0) | 2025.01.08 |
---|---|
[프로그래머스] Lv.1 크기가 작은 부분 문자열 c++ (0) | 2025.01.07 |
[프로그래머스] Lv.1 가장 가까운 같은 글자 c++ (10) | 2025.01.06 |
[프로그래머스] Lv.0 문자열 계산하기 c++ (2) | 2025.01.06 |
[프로그래머스] Lv.1 공원 산책 c++ (0) | 2025.01.05 |