본문 바로가기
개발/기타

[C++] 코딩 테스트에서 편하게 사용할 수 있는 문자열 자르기

by 카펀 2021. 3. 24.

저는 코딩 테스트에서 주로 C++을 사용합니다 (정말 가끔 Python도 사용하긴 합니다).

대학에서 1학년때부터 쭉 커리큘럼 상 C++이 중심이 되기도 했고 (객체지향프로그래밍, 자료구조, 알고리즘이 C++에 기반하였습니다), 이미 많이 익숙해져 있기 때문입니다.

보통 비전공자 출신이시거나 코테를 처음 준비하신다고 생각하면 저는 Python을 추천드립니다. 문법 익히는 난이도도 훨씬 쉽고, 문자열을 다루거나 각종 변수를 다루기에 훨씬 간단하며 작성하는 코드의 길이도 훨씬 짧습니다.

반대로 전공자라면, 저는 Python 이전에 C 혹은 C++를 먼저 공부해야 한다고 생각합니다. 컴퓨터과학 전공자 입장에서 C를 모른다는 것은 많은 부분을 이해할 수 없다는 말이 됩니다 (임베디드, 포인터, 메모리 주소 개념, 리눅스 커널 등의 OS 등등). 심지어 Python의 numpy와 같은 라이브러리는 내부적으로 C로 작성되는 등, 컴퓨터 전공자라면 C는 필수입니다.

 

하지만 코딩 테스트에서는 Python이 여러모로 유리한 것이 사실입니다.

특히 Python이 유리한 부분 중 하나가 문자열을 다룰 때인데, 코딩 테스트에서 문자열을 다루는 문제가 자주 출제된다는 점을 생각하면 이는 중요한 문제입니다.

예를 들어 문제의 입력이 vector <string> rules = {"GAMES C# JAVA SWIFT C++ Kotlin", "DATABASE MySQL MariaDB NoSQL PostgreSQL SQLite", "WEB HTML JavaScript Python CSS C"} 라고 주어진다고 합시다. 총 3개의 문자열이 배열 안에 들어있으며, 각 배열의 내용은 띄어쓰기로 구분되고, 첫 항목은 카테고리, 나머지는 내용이 됩니다.

즉 위와 같은 경우, 띄어쓰기를 기준으로 문자열을 잘라내어 저장할 필요가 있습니다.

 

C++의 <sstream> 라이브러리는 스트림에 들어있는 문자열을 조작하기 위한 라이브러리입니다.

저희가 사용할 것은 istringstream 이라는 클라스입니다.

 

예제 코드를 먼저 보겠습니다.

 

실행 결과

입력은 분명 문자열 통째로 주어졌지만, 이를 공백을 기준으로 잘라서 배열에 넣은 후 순서대로 출력한 모습입니다.

 

핵심이 되는 부분은 다음과 같습니다.

 

string now = rules[i];
istringstream ss(now);
string buffer;
vector<string> result;
result.clear();

while (getline(ss, buffer, ' ')) {
	result.push_back(buffer);
}

 

먼저, now에는 우리가 자르고자 하는 대상 문자열이 들어갑니다.

다음으로, 해당 문자열을 인자로 하여, istingstream ss(now) 를 호출합니다.

이후 ss >> result[0] 이라고 하면 result[0] 에 ss에서 처음 자른 문자열 ("GAMES")이 들어갑니다. ss >> result[0] >> result[1] 이라고 하면, 문자열이 순서로 저장됩니다. result[0] = "GAMES", result[1] = "C#" 이 됩니다.

 

이런 성질을 바탕으로 while문을 이용하여 잘랐습니다.

getline(a, b, c) 함수의 경우 a = 입력스트림, b = 입력받은 문자열을 저장할 string, c = 구분자 가 들어갑니다.

즉 위의 경우 구분자 ' '을 기준으로 입력스트림 ss로부터 문자열을 잘라서, buffer에 저장한 후 이를 result에 push 하는 것입니다.

 

github.com/kchung1995/Programming-Team-Notes/blob/main/C%2B%2B/string/string_parsing.cpp

댓글