2026. 3. 12. 15:11ㆍTIL
코딩테스트 문제를 풀면서

정수를 내림차순으로 배치하는 문제를 풀게 되었다.
문제를 풀면서 문제 없이 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 |