8 min read

cpp[6] - 문자열

앞선

cpp[2] - 입력받기 및 사칙연산
숫자, 문자, 특수문자, 문자열 등을 자유자재로 출력할 수 있게 되었기에, 이들을 입력받아서 활용하는 방법에 대해서 다루도록 하겠습니다. 변수 변수 (Variable)는 수학에서의 x,y,z 와 같은 존재이지만, C++ 언어에서는 박스와 같은 개념으로 이해하는것이 가장 간단합니다. 값이 변할 수 있다는 점은 수학과 동일하지만, 수학과는 다르게 어떤 수식에 의해 종속되어서 y=

에서 문자 한 글자의 입력은 char를 사용함을 알 수 있었고,

cpp[5] - 배열 다루기
변수가 엄청나게 많을 때, 변수들에 일일히 이름을 짓기는 어려울 겁니다. 복잡한 프로그램을 작성함에 따라 아주 많은 변수를 선언해야 하는데, 매번 이름을 붙여주지 않고 날로 먹을 수 있을까요? int a,b,c,d,e,f,g,h...; C++을 포함한 수많은 언어들에서는 이러한 문제를 ”배열” 을 통해 해결하고 있습니다. 오늘은 배열에

에서 동일한 형태의 변수 여러개를 한번에 선언하고 접근하는 배열에 대해 배웠습니다. 이 둘을 결합하면 우리가 원하는 길이의 문자 을 입력받을 수 있는데, 이것을 문자가 나열되어있다는 의미의 문자열 이라고 부릅니다.

오늘은 문자열에 대해서 알아보도록 하겠습니다.

C언어에서의 문자열

C언어에서의 문자열은 앞서 말했던 대로, char형 배열을 통해 입력받거나 사용하게 됩니다.

char arr[100] = "TEST";

다음과 같은 방법으로 문자열을 만들어 담아줄 수 있습니다.
이때 arr[0] 은 문자열의 제일 앞자리, 즉 첫번째 글자인 'T' 가 됩니다.

C언어에서의 문자열은 배열과 동일하기 때문에,
두 배열이 같은 문자열을 담고 있는지를 확인하기 위해서는
배열의 0번째, 1번째, ... 순서대로 비교를 해야 합니다.

C언어에서의 ""과 ''의 차이점

C언어의 단점 중의 하나로, 문자열 부분이 빈약하다는 단점이 있습니다.

C언어에서는 문자열 기능에서 편의성을 위해서 \0 이라는 특수문자를 활용, 문자열의 끝을 표시합니다.

이는, 다시 말하자면

  • "A"A\0 문자 두개가 합쳐진 char형 배열으로 본다는 것이며,
  • 'A'A 문자 한개만 있는 char형 변수로 보게 된다는 말입니다.

따라서, 문자열을 담을 배열을 만들 때에는, 반드시 저장할 문자열의 길이보다 배열의 크기를 1 더 크게 만들어야 합니다. 한칸 더 만들어진 여유공간에 \0 문자가 들어가야 문자열의 끝임을 제대로 알 수 있기 때문입니다.

이 때문에 C언어에서 ""'' 는 서로 다른 역할을 가지고 있으며,
이를 혼용해서 사용할 경우 프로그램의 컴파일에 실패하거나
원하는 대로 동작하지 않을 수 있습니다.

이는 C언어와의 호환성을 위해 C++에도 동일하게 적용됩니다.

C++에서의 문자열

위에서 보았던 것 외에도, C언어의 char 배열을 사용한 문자열 사용은 속도가 느리다거나 하는 잡다한 단점들이 많습니다. 이를 해결하기 위해서, C++ 에서는 string 이라는 새로운 자료형을 추가했습니다.

string형 변수의 사용법은 아래와 같습니다.

string s = "hello world";
string s2;
cin >> s2;

char형 배열을 통해 문자열을 만들 때에는 문자열의 최대 길이를 알고 있어야 미리 배열의 크기를 정해줄 수 있었지만, string 형에서는 필요한 만큼 자동으로 공간을 할당합니다.

즉, 문자열의 최대 크기에 대해서 고민할 필요가 없게 되며,

cout << s[0]; // 출력 : h
cout << s[1]; // 출력 : e

일반적인 배열과 똑같이 원소를 통한 각 char형 변수의 접근도 가능합니다.

덤으로 배열이 아니라 별도의 자료형이 되면서

  • 논리연산자 ==
  • 산술연산자 +
    두가지를 사용할 수 있습니다.
if(s == "hello world"){} // if문을 통한 비교
s = "hello" + "world" // 문자열 간 덧셈 연산 (결과 : "helloworld")

문자열의 길이

문자열의 길이를 알아내는 것은 문자열에 대한 반복문을 실행하기에 아주 필수적인 사항입니다.

C언어에서는 끝이 \0 문자인지를 확인하는것으로 문자열의 길이를 판별하기 때문에, 문자열의 처음부터 끝까지 확인해보고 '\0' 문자가 어디서 등장하는지를 찾는 strlen(arr) 함수를 사용합니다.

C++에서는 문자열의 길이가 기본적으로 저장이 되어있기 때문에,
s.length() 를 통해서 문자열에 접근할 수 있습니다.

당연히 문자열을 일일히 찾아보는 strlen(arr) 보다 s.length() 가 더 빠르며, 알고리즘 문제해결에 있어 이는 중요한 부분이므로 C++의 string형을 사용하는 쪽을 추천드립니다.

결론

문자열은 자료형에 대해 먼저 습득한 후에야 비로소 이해가 가는 부분입니다. 배열 인덱스를 통한 접근에 익숙해져 계시다면

27866번: 문자와 문자열

위와 같은 문제를 쉽게 해결하실 수 있습니다.

#include <iostream>
using namespace std;

int main(){
	string s;
	int i;
	cin >> s >> i;
	cout << s[i-1];
	return 0;
}

문자열 S의 i번째 글자는 다시 말하면 문자열 S 배열에서 i-1번째 원소를 찾는 문제로 치환할 수 있습니다. 배열의 원소는 0부터 시작하기에 i에 1을 빼준다는것을 유의해주셔야 합니다.

solved.ac - 문제 › 새싹
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

문자열 개념과 다음 시간에 볼 아스키 코드 까지 다루실 줄 아시게 되시면,
문제 > 새싹 > 문자열 부분을 해결할 수 있습니다.

문자열은 알고리즘 문제풀이에서 그렇게 자주 등장하는 부분은 아니지만,
모르고 있는 경우 문제를 해결할 수 없기에 반드시 익혀두시는걸 추천합니다.