C++ < String >

2026. 3. 12. 15:11TIL

코딩테스트 문제를 풀면서 

정수를 내림차순으로 배치하는 문제를 풀게 되었다.

 

문제를 풀면서 문제 없이 Vector와 sort 등 C++라이브러리의 함수를 이용해서 풀었다.

#include <vector>
#include <algorithm>

using namespace std;

long long solution(long long n) {
    vector<int> vec;
    while(n>0)
    {
        vec.push_back(n%10);
        n /= 10;
    }
    sort(vec.begin(), vec.end(), greater<int>());
    long long answer = 0;
    
    for(int i : vec)
    {
        answer = answer * 10 + i;
    }
    
    return answer;
}

코드 자체에는 문제가 없었으나 다른 사람의 풀이를 보며 아주 효율적인 방법이 있었음을 깨달았다.

#include <string>
#include <algorithm>

using namespace std;

long long solution(long long n) {
    string s = to_string(n);

    sort(s.begin(), s.end(), greater<char>());

    return stoll(s);
}

코드의 길이가 반으로 줄어드는 모습을 보고 string을 이용하는 방법도 있구나 하고 생각했다.

 

하지만 문자열에 대한 지식이 조금 부족해 다시 정리해보려고 한다.

 


String

C++에서 문자열을 다루는 방법은 크게 두 가지가 있다.

 

C 스타일의 char배열

C++ string 클래스

 

이렇게 두 가지가 있다. 현대 c++에서는 string을 사용하는 것이 일반적이고 위에서 볼 수 있듯 확실히 편하다.

 

문자열?

문자열은 문자들의 집합이다.

문자열은 "hello" , "world" 등 이런 단어도 문자열로 분류된다.

 

이 문자열들은 다음과 같이 저장된다.

"H e l l o"

이렇게 각 문자들은 연속된 메모리 공간에 저장된다.

 

왜 C스타일은 사용하지 않는가?

C에서 

char str[] = "hello";

이런식으로 문자열을 저장하면 메모리 구조는

h e l l o \0

이렇게 null character가 들어가게 된다.

 

여기서 문제점은 다음과 같다.

  • 길이 관리가 어려움
  • 문자열 연산 불편
  • 메모리 오류 발생 가능

이러한 이유로 string 클래스를 사용하게 되었다.

 

c++ string 클래스

C++에서 <string>헤더에서 string을 제공한다.

 

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

int main()
{
    string s = "hello";

    cout << s;
}

 

특징으로는

  • 문자열 길이 자동 관리
  • 다양한 함수 제공
  • 메모리 안전

이 있다.

 

string의 선언 방법으로는 다양한 방법이 있다.

 

기본선언
string s;

문자열 초기화
string s = "hello";

생성자 방식
string s("hello");

반복 문자 생성
string s(5, 'a');
>> aaaaa

이렇게 선언할 수 있다.

 

문자열에 배열처럼 접근할 수도 있다.

 

string s = "hello";

cout << s[0];

>> h

이런식으로 접근할 수도 있고, 각 문자열의 인덱스에 접근해 문자열을 수정할 수도 있다.

 

s[0] = 'H';

>> Hello

 

이와 같이 자유도가 높은 것을 확인할 수 있다.

 

문자열 연결

문자열은 쉽게 합칠 수 있다.

string a = "hello";
string b = "world";

string c = a + " " + b;

>> hello world

C에서는 배열을 이렇게 합칠 수 없었지만 string 클래스에서는 쉽게 합칠 수 있다.

 

문자열 비교

string a = "apple";
string b = "banana";

if(a < b)
{
    cout << "apple이 더 앞";
}

문자열은 사전순으로 비교하기 때문에 다음 출력 결과는 b가 더 크므로 조건문이 참이되어 

"apple이 더 앞" 이 출력된다

 

자주 사용하는 string 함수

length()

문자열 길이를 구하는 함수이다.

string s = "hello";

cout << s.length();

>> 5

 

substr()

부분 문자열을 추출하는 함수이다.

substr(시작위치, 길이)

string s = "programming";

cout << s.substr(0,7);

>> program

 

 

find()

문자열의 위치를 찾는 함수이다.

string s = "hello world";

cout << s.find("world");

>> 6

찾지 못하면
string::npos

 

 

erase()

string s = "hello";

s.erase(1,2);

>> hlo

인덱스 값을 넣어 문자를 삭제한다

위 코드에선 인덱스 1번부터 2번까지 전부 삭제를 하도록 erase를 사용해서 e와 l이 삭제되어 hlo가 되었다.

 

insert()

string s = "heo";

s.insert(2,"ll");

>> hello

위에 erase()와 반대로 insert()로 인덱스 위치에 문자열을 삽입할 수도 있다.

 

 

문자열 정렬

문자열도 vector처럼 sort함수를 사용해서 정렬할 수 있다.

 

#include <algorithm>을 헤더에 선언한 후 sort()함수로 사용하면 된다.

#include <algorithm>

string s = "dcba";

sort(s.begin(), s.end());

>> abcd

sort(s.begin(), s.end(), greater<char>());

>> dcba

 

greater<char>를 사용하면 내림차순으로도 가능하다.

 

문자열 변환

숫자를 문자열로, 문자열을 숫자로 변환할 수 있다.

 

숫자를 문자열로 변환하는 방법은 

to_string() 함수를 사용하면 된다.

 

문자열을 숫자로 변환하는 방법은 다음과 같다.

  • stoi() --------- string > int
  • stoll() -------- string > long long
  • stod() -------- string > double

 

C문자열과 비교해서 string 사용시 장점

C문자열 C++ string
길이 계산 필요 자동 관리
strcpy = 사용 가능
strcat 필요 + 사용 가능
위험한 메모리 안전

 

 

정리

C++ string은 문자열을 쉽게 다룰 수 있게 만든 클래스이다.

 

주요 특징

  • 배열처럼 접근 가능
  • 다양한 문자열 함수 제공
  • 숫자 변환 가능
  • 정렬 가능

그래서 현대 C++에서는 char 배열보다 string 사용을 권장하고 있다.

'TIL' 카테고리의 다른 글

[TIL 44일차]언리얼C++ 액터 기본세팅  (1) 2026.04.07
Unreal Engine C++  (1) 2026.03.27
C언어 <math.h>  (0) 2026.03.11
C++ < STL (기초) >  (1) 2026.03.10
C++ < Template(템플릿) >  (0) 2026.03.10