- C++ 코드카타
- UE5 C++ 인벤토리 시스템(개인 공부)
매일 코드카타를 진행하면서 문자열 처리 관련 알고리즘 문제들을 풀게되면 꼭 문자열 처리 함수들을 검색하는 나를 보게된다.
계속 함수 검색을 해가면서 하는 것도 옳지 않은 방법이기 때문에 오늘 한 번 제대로 정리해보려고 한다.
오늘 풀었던 문제는 아래와 같은데 문제 해결 능력도 문제이긴 하지만, 슬라이싱/형 변환 등을 할 수 있는지가 주요 평가 요소 였다.
https://school.programmers.co.kr/learn/courses/30/lessons/150370
문자열 슬라이싱을 제공해주는 함수로 substr()이 있다.
(size_t가 자주 명시되어 있는데, unsigned long long의 별명이다.)
// pos: 시작 인덱스
// count: 뽑을 개수
string substr(size_t pos = 0, size_t count = npos) const;
예시
#include <string>
using namespace std;
int main()
{
string date = "2026.03.24";
string year = date.substr(0, 4); // "2026"
string month = date.substr(5, 2); // "03"
// 뽑을 개수를 생략하면 시작 인덱스부터 문자열 끝까지 반환한다.
string day = date.substr(8); // "24"
}
단, Python처럼 특정 문자를 기준으로 슬라이싱하는 함수는 존재하지 않는다.
string->int로는 stoi() 함수를 사용하면 된다.
(double은 stod(), long long은 stoll(), 반환형을 제외한 동작 방식은 동일)
// str: 변환할 문자열
// pos: 읽기를 멈춘 위치(인덱스) 값(예시 참고)
// base: 진법
int stoi(const string& str, size_t* pos = nullptr, int base = 10);
예시
#include <string>
using namespace std;
int main()
{
int num = stoi("123"); // 123
// stoi()는 도중에 문자를 정수로 변환하지 못하면
// 했던 부분까지의 결과를 반환하고 함수를 종료한다.
// 멈춘 위치를 알고 싶다면 위치를 담을 변수의 주소를 넘겨주면 된다.
int pos;
string s = "123p";
num = stoi(s, &pos) // 123, pos = 3(인덱스 3에서 멈췄으므로)
// 만약, 처음부터 숫자로 변환하지 못하는 문자가 있으면 에러가 발생한다.
num = stoi("p123"); // error!
}
int->string으로는 to_string() 함수를 사용하면 된다.
(double처럼 int 이외의 타입도 가능)
string to_string(int val);
예시
#include <string>
using namespace std;
int main()
{
string s = to_string(324); // "324"
}
지금은 잘 사용하지 않지만, C++11 이전에는 atoi()/c_str()을 이용한 형 변환을 사용했다.
int atoi(const char* str) -> const char* 타입을 숫자로 형 변환
const char* c_str(string str) -> string 타입을 const char* 타입으로 형 변환
예시
#include <cstdlib> // atoi()
#include <string> // c_str()
using namespace std;
int main()
{
int num = atoi("123"); // 123
// atoi()도 도중에 문자를 정수로 변환하지 못하면
// 했던 부분까지의 결과를 반환하고 함수를 종료한다.
// 단, 멈춘 위치를 저장하는 기능은 없다.
string s = "123p";
num = atoi(s.c_str()) // 123
// 또한, stoi()와 달리 처음부터 숫자로 변환하지 못하는 문자가 있으면 0을 반환한다.
num = stoi("p123"); // 0
}
앞에서부터 검색해서 특정 문자열을 탐색하려면 find() 함수를 사용하면 된다.
// str: 탐색할 문자열
// pos: 탐색 시작 위치
// 탐색에 성공하면 특정 문자열의 시작 위치(인덱스)를 반환
size_t find(const string& str, size_t pos = 0) const;
예시
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s = "Unreal C++ Programming";
int pos = s.find("C++"); // 7 반환
// 만약 찾으려는 문자열이 없으면 string::npos라는 쓰레기 값을 반환한다.
if (s.find("Python") == string::npos)
{
cout << "찾는 문자열 없음" << endl;
}
}
아직까지는 알고리즘 문제를 풀어보았을 때, 문자열 처리 함수는 언급한 내용 이외에는 자주 사용하지 않거나 바로 해결할 수 있는 문제라서 이 정도만 정리를 하고 나중에 포스팅 하는 것이 좋을 것 같다.