본문 바로가기

Algorithm/카카오기출

[프로그래머스]다트게임 / stringstream

문제

 

풀이

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

int solution(string dartResult) {
	int answer = 0;
	int i = 0;
	vector<int> score(3, 0);
	char word;

	for (int j = 0; j < 3; j++) {
		score[j] = dartResult[i] - '0';
		if (dartResult[i + 1] == '0') {
			score[j] = 10;
			i++;
		}

		word = dartResult[++i];
		if (word == 'D') score[j] = pow(score[j], 2);
		else if (word == 'T') score[j] = pow(score[j], 3);

		if (dartResult[++i] != NULL) {
			word = dartResult[i];
			if (word == '*') {
				score[j] = score[j] * 2;
				if (i != 0) score[j - 1] = score[j - 1] * 2;
			}
			else if (word == '#') score[j] = score[j] * -1;
			else continue;
		}
		i++;
	}

	return answer = score[0] + score[1] + score[2];
}

 

 

++ Java풀이 추가

https://strong-2-min.tistory.com/294

 

[프로그래머스(java)] 다트 게임 - stack

Level. 1 문제 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길

strong-2-min.tistory.com

 

 


 

 

다른 사람 코드

#include <string>
#include <sstream>
#include <cmath>

using namespace std;

int solution(string dartResult) {
    stringstream ss(dartResult);

    int sum[3] = { 0, 0, 0 };
    int options[3] = { 1, 1, 1 };
    for (int i = 0; i < 3; i++) {
        int score;
        char bonus;
        char option;

        ss >> score;

        bonus = ss.get();
        option = ss.get();

        if (option != '*' && option != '#') {
            ss.unget();
        }

        switch (bonus) {
        case 'S':
            sum[i] += pow(score, 1);
            break;
        case 'D':
            sum[i] += pow(score, 2);
            break;
        case 'T':
            sum[i] += pow(score, 3);
            break;
        default:
            break;
        }

        switch (option) {
        case '*':
            if (i > 0 && options[i - 1]) options[i - 1] *= 2;
            options[i] *= 2;
            break;
        case '#':
            options[i] = -options[i];
            break;
        default:
            break;
        }
    }

    return sum[0] * options[0] + sum[1] * options[1] + sum[2] * options[2];
}

 

stringstream을 이용해 문자열에서 필요한 정보를 꺼내왔다. 문자열 하나하나 빼와서 비교했던 내 코드와 달리 아주 깨끗한 이유!

문자열에서 정보를 가져올 때는  stringstream를 이용해보도록 해야겠다.

 

- stringstream 사용하면 공백과 '\n'을 제외하고 문자열에서 맞는 자료형의 정보를 빼낼 수 있다.

- get() : 커서를 하나씩 옮기면서 값을 반환한다.

 

 


다른사람 코드 2

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

int solution(string dartResult) {
    vector<int> v;
    for(int i = 0, s = 0; i < dartResult.size(); ++i) {
        if(dartResult[i] >= '0' && dartResult[i] <= '9')
            s = s * 10 + dartResult[i] - '0';
        else if(dartResult[i] == 'S') v.push_back(s), s = 0;
        else if(dartResult[i] == 'D') v.push_back(s * s), s = 0;
        else if(dartResult[i] == 'T') v.push_back(s * s * s), s = 0;
        else if(dartResult[i] == '*') {
            if(v.size() > 1) v.back() *= 2, v[v.size() - 2] *= 2;
            else v.back() *= 2;
        } else v.back() = -v.back();

    }
    int ans = 0;
    for(int i = 0; i < v.size(); ++i) ans += v[i];
    return ans;
}

위 코드도 깔끔해서 참고할 겸 가져왔다.

 

 

 


https://word.tistory.com/24

 

Stringstream 사용법 정리

헤더 : stringstream은, 주어진 문자열에서 필요한 정보를 빼낼 때 유용하게 사용된다. 간단한 사용 예를 보자. float num; stringstream stream1; string string1 = "25 1 3 .235\n1111111\n222222"; stream1.str..

word.tistory.com

https://deukyu.tistory.com/48

 

[C/C++] stringstream 사용법

stringstream 사용법 INTRO C++ 에서는 여러가지 자료형이 string으로 한 줄에 들어오면 이것을 어떤 식으로 해야할지 고민하다가 stringstream 을 찾았는데, 한 줄에 들어오면 파싱해서 용도에 맞게 사용

deukyu.tistory.com

https://life-with-coding.tistory.com/403

 

[C++] stringstream 사용법

인트로 안녕하세요. 오늘은 C++의 Stringstream 사용법에 대해 포스팅하겠습니다. C++에서 여러가지 자료형이 한 줄에 들어오면 파싱해서 용도에 맞게 사용할 필요가 있는데요. 특히 "이름 날짜 내용"

life-with-coding.tistory.com