내일배움캠프 22일차 - 자료구조 & 알고리즘 4주차 : String

String

 - string은 사실 vector<char>사촌이다. string문자(char)를 연속 메모리에 담는 것.

 - 인덱스 접근방법 O(1), size(), push_back() 모두 vector와 동일

 - string은 vector<char>에서 찾기, 자르기, 바꾸기 기능이 추가된 형태이다.


find - 검색 위치를 반환

 - s.find("찾을 문자열")를 호출하면 시작 인덱스(위치)를 반환한다.

s.find("World") → 6

 - 찾지 못하면 string::npos라는 특별한 값을 반환한다. (npos = "no position"의 줄임말)
 : find를 쓰면 반드시 npos를 체크하여 버그를 놓치지 않도록 하자.


find의 두 번째 매개변수

 - find의 두 번째 매개변수를 설정하면 "어디서부터 찾을지"를 지정한다.

s.find("Hello",7) // 인덱스 7부터 검색 시작

시간복잡도: 최악 O(n×m) (n: 원본 길이, m: 검색어 길이)
한글자 씩 비교해나가는 방식 - 아주 긴 문서에서 Ctrl+F가 살짝 느릴 수 있는 이유

substr - 원하는 부분만 떼어내기(부분 문자열 추출)

 - s.substr(시작위치, 길이) → 일부분을 복사한 새 문자열 반환
 - 두 번째 매개변수 생략 시 시작위치부터 끝까지 잘라낸다.

※ 중요: substr원본을 수정하지 않고 새 문자열을 만든다.

s.substr(0,5) → "Hello"
s.substr(6) → "World"

 - 위치를 찾고(find), 그 위치를 기준으로 잘라내기(substr)
  : 실전에서 가장 많이 쓰이는 패턴이다.

find, substr 활용 예시

replace - 범위를 새 문자열 교체

 - s.replace(시작위치, 길이, "새문자열") -> 원본을 직접 수정

replace는 substr와 달리 원본이 바뀐다.

 - replace() 한번으로는 하나만 교체된다.
  : 모두 바꾸려면 루프 필요.

find + replace 루프 사용시 주의점

 - 문자열 내의 모든 '특정 문자열''특정 문자열이 포함된 문자열'로 변경할 때 무한루프가 되는 예외상황이 발생할 수 있다.

ex) "apple" → "pineapple" 루프
 → "apple is pineapple" →"pineapple is pineapple" → "pinepineapple is pineapple" → "pinepinepineapple" → 무한반복

 - 이를 해결하려면 pos += 새문자열.length()를 사용해야 한다.
  : 이는 다음 find로 검색할 위치를 pos(이전 검색위치)+새문자열 길이부터 찾겠다는 뜻이다.

stringstream - 문자열을 여러조각으로 분리

 - 문자열을 마치 입력스트림(cin) 처럼 취급해서 데이터를 하나씩 꺼낼 수 있게 해준다.

stoi() / to_string() 문자열 ↔ 숫자 변환

stoi() : "45" → 45
to_string() : 45 → "45"

문자열 "45"를 정수 45로 변환하거나 반대로 할 수 있다.

ASCII (American Standard Code for Information Interchange)

 - 총 128개 문자를 7비트로 표현하는 표준

 - 이를 활용해 문자에 덧셈을 해 다른 문자로 변환할 수 있다.
 ex) 'A' + 1 = 65 + 166 = 'B'
isalpha(), isdigit() 같은 함수도 결국 ASCII 숫자 범위를 비교하는 것이다.

 - 대소문소문자항상 32 차이
toupper('a') = 97 - 32 = 65 = 'A'
tolower('A') = 65 + 32 = 97 = 'a'

ASCII 코드표

유니코드

 - ASCII는 128개뿐이다. 그렇다면 한글, 일본어, 이모지는?

웹에서 깨진 문자를 본 적 있다면 - 인코딩 불일치가 원인


실전예시

게임개발
 - 채팅 필터링(금칙어 → 별표), 세이브/로드(직렬화 → 파싱)
 - UE5의 FStringFind()Mid()Replace() 제공 (오늘 배운 것과 같은 이름)

웹/서버
 - URL 파싱(호스트, 경로, 쿼리 분리) JSON/XML 파싱
 - 서버 로그 분석: find + substr + stringstream이 기초 패턴

일반 CS
 - 문자 인코딩 = 운영체제, 네트워크, 데이터베이스 모두에 영향
 - 나중에 배울 해시(Hash)에서도 "문자 = 숫자"가 핵심 기초


오늘의 핵심

- string은 vector<char>의 사촌: 연속 메모리, 인덱스 접근 O(1)
 여기에 문자열 전용 도구가 추가된 것

 - 세가지 핵심 도구: find(찾기), substr(추출), replace(바꾸기)
 이 셋의 조합으로 대부분의 문자열 처리가 가능

 - find +npos 체크는 세트
 find의 결과를 npos와 비교하지 않으면 버그의 원인이 된다.

 - 문자는 숫자다: 'A'=65, 'a'=97
 toupper / tolower는 32를 빼고 더하는 연산

 - stringstream으로 분리, stoi / to_string으로 상호 변환

댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁