티스토리 뷰

다트 게임


입출력 예제 

dartResult : 1S2D*3T

answer : 37


풀이 과정

저는 이 문제를 문제 과정 그대로 따라가듯이 했습니다

숫자를 읽어 들이고 그다음 문자를 읽고 스타상일 때 과정, 아차상일 때 과정 둘다 존재하지 않을 때 과정을 따로 if문을 이용해서 문제를 해결해나갔습니다.

c++에서 string에서 int로 바꾸는 방법은 stoi()함수를 이용해서 정수형으로 사용할 수 있습니다.

그리고 flag를 이용해서 첫번째 스타상일 때 처리를 하려고 만들었습니다. 이것때문에 다른 아차상과 보너스가 없을 때도 flag를 처리해야 해서 코드가 길어져버렸네요. 너무 많아서 flag를 내려도 되겠지만 처음 구현했을 때여서 수정을 하지 않았습니다.

각 숫자마다 계산이 되면 vnumber라는 배열에 저장을 해놓고 끝에는 vnumber의 합을 구해서 최종 결과값을 구했습니다.


소스 코드

#include <string>
#include <vector>
using namespace std;

int solution(string dartResult) {
	int answer = 0;
	bool flag = false;
	string number = "";
	int inumber = 0;
	vector<int> vnumber;
	for (int i = 0; i < dartResult.length(); i++) {
		if (dartResult[i] >= '0'&&dartResult[i] <= '9') {
			number += dartResult[i];
		}
		else if(dartResult[i] == 'D' || dartResult[i] == 'S' ||dartResult[i]=='T') {
			inumber = stoi(number);
			number = "";
			if (dartResult[i + 1] == '*') {			//스타상
				if (dartResult[i] == 'S') {
					if (flag == false) {
						vnumber.push_back(inumber*2);
						flag = true;
					}
					else {
						vnumber[vnumber.size() - 1] *= 2;
						vnumber.push_back(inumber*2);
					}
				}
				else if (dartResult[i] == 'D') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber*2);
						flag = true;
					}
					else {
						vnumber[vnumber.size() - 1] *= 2;
						vnumber.push_back(inumber*inumber*2);
					}

				}
				else if (dartResult[i] == 'T') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber*inumber*2);
						flag = true;
					}
					else {
						vnumber[vnumber.size() - 1] *= 2;
						vnumber.push_back(inumber*inumber*inumber*2);
					}
				}
				i++;
			}
			else if (dartResult[i + 1] == '#') {	//아차상
				if (dartResult[i] == 'S') {
					if (flag == false) {
						vnumber.push_back(inumber*(-1));
						flag = true;
					}
					else {
						vnumber.push_back(inumber*(-1));
					}
				}
				else if (dartResult[i] == 'D') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber*(-1));
						flag = true;
					}
					else {
						vnumber.push_back(inumber*inumber*(-1));
					}

				}
				else if (dartResult[i] == 'T') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber*inumber*(-1));
						flag = true;
					}
					else {
						vnumber.push_back(inumber*inumber*inumber*(-1));
					}
				}
				i++;
			}
			else {
				if (dartResult[i] == 'S') {
					if (flag == false) {
						vnumber.push_back(inumber);
						flag = true;
					}
					else {
						vnumber.push_back(inumber);
					}
				}
				else if (dartResult[i] == 'D') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber);
						flag = true;
					}
					else {
						vnumber.push_back(inumber*inumber);
					}

				}
				else if (dartResult[i] == 'T') {
					if (flag == false) {
						vnumber.push_back(inumber*inumber*inumber);
						flag = true;
					}
					else {
						vnumber.push_back(inumber*inumber*inumber);
					}
				}
			}
		}
	}

	for (int i = 0; i < vnumber.size(); i++) {
		answer += vnumber[i];
	}
	return answer;
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함