소소한 개발 공부

[프로그래머스] 컨트롤 제트 split 본문

프로그래밍/C & C++

[프로그래머스] 컨트롤 제트 split

이내내 2022. 10. 27. 14:54

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을 구현할 수 있다.