소소한 개발 공부
[프로그래머스] 컨트롤 제트 split 본문
https://school.programmers.co.kr/learn/courses/30/lessons/120853
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문자열 입력으로 들어온 숫자를 차례로 더하되, Z가 들어오면 덧셈을 되돌리는 문제이다.
예를 들어 "1 2 3 Z Z"가 들어오면 1, 2, 3을 순차적으로 더하고, Z를 만나서 3을 다시 빼고, 또 Z를 만나서 2를 빼는 실행이다.
우선 문자열을 white space 를 구분자로 하여 나누는 split을 하고,
나눈 문자열을 정수 형태로 바꾸는 stoi를 실행하는데,
문자열이 Z라면 더한 것을 빼 주기 위해 stack 을 활용한다.
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<string> split(string s, char delimiter)
{
vector<string> ret;
stringstream ss(s);
string tmp;
while (getline(ss, tmp, delimiter))
ret.push_back(tmp);
return ret;
}
int solution(string s) {
int answer = 0;
vector<int> tmp;
vector<string> sp = split(s, ' ');
for (auto p : sp)
{
if (p == "Z")
{
answer -= tmp.back();
tmp.pop_back();
continue;
}
answer += stoi(p);
tmp.push_back(stoi(p));
}
return answer;
}
c++은 split 내장 함수가 없기 때문에 직접 만들어준다.
(split 대신 strtok라고 split과 비슷한 기능을 하는 내장함수가 있는데, 이는 매개변수로 char *를 쓰기 때문에 strtok에 대해서는 다음에 알아보기로 한다..)
Split
string 문자열을 delimiter(구분자)로 나누는 함수이다.
예를 들어 "h e l l o world!" 문자열을 "h", "e", "l", "l", "o", "World!"로 나눠서 새로운 vector<string> 혹은 string 배열에 담는 것이다.
먼저 sstream 헤더를 포함해줘야 한다.
그리고 문자열 s를 stringstream 형식으로 변환시킬 변수가 필요하다 -> ss
while 을 돌리면서 getline으로 문자열을 delimiter 기준으로 끊는다.
끊은 문자열은 tmp에 담아 vector<string>에 넣는다.
#include <sstream>
vector<string> split(string s, char delimiter)
{
vector<string> ret;
stringstream ss(s);
string tmp;
while (getline(ss, tmp, delimiter))
ret.push_back(tmp);
return ret;
}
이런 식으로 split을 구현할 수 있다.
'프로그래밍 > C & C++' 카테고리의 다른 글
[프로그래머스] 소수 만들기 recursion, 재귀 (0) | 2022.11.15 |
---|---|
[프로그래머스] 폰켓몬 unordered_set, set (0) | 2022.11.15 |
[프로그래머스] 소인수분해 unique, erase (0) | 2022.10.25 |
[프로그래머스] 특정 문자 제거하기 string.find, string.replace (0) | 2022.10.21 |
[프로그래머스] 문자열 뒤집기 string, reverse (0) | 2022.10.21 |