C++ stringstream ( [프로그래머스] 다트 게임 )

quokka·2022년 9월 8일
0

Algorithm

목록 보기
18/20

stringstream

문자열에서 내가 원하는 자료형의 데이터를 추출하는데 유용하다.

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string str = "12 34\n567";
    stringstream ss(str);
    int num;
    while (ss >> num) {
        cout << num << ' ';
    }
}

// 12 34 567 

ss >> num에서 num이 int 타입이므로 공백 또는 \n 단위로 정수를 추출할 수 있다.

중간에 정수로 추출할 수 없는 문자가 있으면 그 전까지 출력된다.

int main() {
    string str = "12 3R4\n567";
    stringstream ss(str);
    int num;
    while (ss >> num) {
        cout << num << ' ';
    }
}

// 12 3

문자열 단위로 추출한 경우

int main() {
    string str = "12 3T4\n567";
    stringstream ss(str);
    string num;
    while (ss >> num) {
        cout << num << ' ';
    }
}

// 12 3T4 567 

char 단위로 추출한 경우

int main() {
    string str = "12 3T4\n567";
    stringstream ss(str);
    char num;
    while (ss >> num) {
        cout << num << ' ';
    }
}

// 1 2 3 T 4 5 6 7 

여러 데이터 유형으로 추출한 경우

int main() {
    string str = "12 T4\n567";
    stringstream ss(str);
    int num1;
    char ch;
    int num2;
    string s;
    ss >> num1>>ch>>num2>>s;
    cout<<num1<<' '<<ch<<' '<<num2<<' '<<s;
}

// 12 T 4 567

get() unget()

get()을 사용하면 커서를 이동하며 다음 char를 가져온다.
unget()을 하면 커서를 앞으로 한 칸 이동한다.

int main() {
    string str = "1 2A";
    stringstream ss(str);
    int num1;
    char ch1, ch2, ch3;

    num1 = ss.get();
    ch1 = ss.get(); // 공백
    ch2 = ss.get();
    ch3 = ss.get();
    cout << num1 << ' ' << ch1 << ' ' << ch2 << ' ' << ch3;
}

// 49   2 A

num1은 1의 아스키코드값인 49가 추출되었고, ch1은 공백, ch2는 2, ch3는 A가 추출된 것을 알 수 있다.

다트 게임

stringstream을 활용할 수 있는 문제이다.

문제

[1차] 다트 게임 문제 링크

다트를 3번 던졌을 때의 결과가 문자열로 주어지면 점수를 구한다. 입력 형식은 다음과 같다.

점수|보너스|[옵션]으로 이루어진 문자열 3세트.
예) 1S2D*3T

점수는 0에서 10 사이의 정수이다.
보너스는 S, D, T 중 하나이다. (S는 점수^1, D는 점수^2, T는 점수^3)
옵션은 *이나 # 중 하나이며, 없을 수도 있다. ( *은 해당 점수와 바로 전에 얻은 점수를 각 2배로, #은 해당 점수를 마이너스로 바꾼다)

풀이

처음에는 dartResult[i] 처럼 인덱스로 접근해서 풀었고, 이렇게 풀어도 통과된다. AC 받고 다른 사람 풀이를 확인했는데 stringstream으로 풀이한 것이 훨 깔끔해서 내용을 정리해봤다.

소스코드

#include <string>
#include <sstream>
#include <vector>

using namespace std;

int solution(string dartResult) {

    vector<int> vec(3, 0);
    int num;
    stringstream ss(dartResult);

    for (int i = 0; i < 3; i++) {
        ss >> num;
        char bonus, opt;

        bonus = ss.get();
        if (bonus == 'D') num *= num;
        else if (bonus == 'T') num *= num * num;
        vec[i] = num;

        opt = ss.get();
        if (opt == '*') {
            if (i > 0) vec[i - 1] *= 2;
            vec[i] *= 2;
        } else if (opt == '#') {
            vec[i] *= -1;
        } else ss.unget();
    }

    return vec[0] + vec[1] + vec[2];
}

0개의 댓글