최근에 이것 저것 준비하면서 자주 보이는 것들이 문자열 관련된 것들이었다.

학생 시절에는 대부분 C아니면 matlab을 사용했고 문자열을 다룰 일도 별로 없었다.

현재 회사에서도 문자열을 처리할 일이 없다... 는 변명이고

아무튼 문자열 처리를 좀 숙달할 필요가 있겠다 싶어 정리한다.

C++에서는 stringstream을 이용해서 문자열을 좀 더 쉽게 처리할 수 있었다.

string stream은 sstream header에 정의되어 있다.

참고 - https://caniro.tistory.com/187

https://myprivatestudy.tistory.com/48

 


다음과 같은 문자열이 들어오는 경우 각 단어를 분류하여 다음과 같이 출력하려면 어떻게 해야 할까

 

Input ->

"apple 10ea

coke 5can

orange 12ea

note 5ea

pen 20ea

coffe 13can"

 

Return ->

"Fruits 22ea

Beverage 18can

Stationary 25ea"

 


1. istringstream으로 input을 파싱한다.

2. 파싱된 string을 buffer에 insert한다. (while)

3. buffer를 분류한다.(과일, 문구, 음료)

4. flag를 세팅한다. 과일인지 문구인지...

5. flag를 보고 counting한다.

반복..

 

string solution(string input) {
    string answer;
    istringstream ss(input);
    string buf;
    int numFruit=0;
    int numBevarage=0;
    int numStatinary=0;
    pair<string,int> flag={"", 0};
    while(ss >> buf) {
        if(flag.second%2==0) {
            flag.first = buf;
        }
        else {
            if(flag.first == "apple" || flag.first == "orange") {
                buf.erase(buf.find("ea"));
                numFruit += stoi(buf);
            }
            if(flag.first == "note" || flag.first == "pen") {
                buf.erase(buf.find("ea"));
                numStatinary += stoi(buf);
            }            
            if(flag.first == "coke" || flag.first == "coffee") {
                buf.erase(buf.find("can"));
                numBevarage += stoi(buf);
            }
        }
        flag.second+=1;
        cout << "buf : " << buf << endl;
        cout << numFruit <<" "<< numBevarage <<" "<< numStatinary << endl;
    }


    return answer;
}

 

string의 find함수를 사용하여 숫자 뒤에 붙어있는 문자들을 지웠다.

다음에 코딩테스트에 string이 나오면 적절하게 사용해봐야겠다.

'Language' 카테고리의 다른 글

[C++] Smart pointer  (0) 2022.06.20
[C++] std::generate, std::for_each  (0) 2022.05.08

+ Recent posts