이 튜토리얼에서는 문자열의 마지막 N줄을 출력하는 프로그램을 다룹니다.
문제의 조건은 다음과 같습니다. 줄바꿈 문자(\n)가 포함된 문자열과, 뒤에서부터 출력할 줄의 개수 N이 주어집니다. 우리의 목표는 문자열의 끝에서부터 거꾸로 탐색하여 마지막 N개의 줄을 모두 출력하는 것입니다.
접근 방법
이 문제는 C 스타일 문자열(char 배열)과 포인터를 활용해 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 먼저
strrchr()함수를 사용해 문자열에서 가장 마지막 줄바꿈 문자의 위치를 찾습니다. - 그 위치부터 시작하여 줄바꿈 문자를 만날 때마다 포인터를 앞으로 이동시키며 줄의 개수를 셉니다.
- N개의 줄을 모두 찾거나 문자열의 시작에 도달하면 반복을 종료합니다.
- 마지막으로 해당 위치부터 문자열 끝까지 출력하면 원하는 결과를 얻을 수 있습니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
// 마지막 N줄을 출력하는 함수
void print_last_lines(char *str, int n){
if (n <= 0)
return;
size_t cnt = 0; // 줄의 개수 저장
char *target_pos = NULL;
// 마지막 줄의 시작 위치 찾기
target_pos = strrchr(str, DELIM);
if (target_pos == NULL){
cout << "주어진 문자열은 한 줄짜리 문자열입니다";
return;
}
// 첫 번째 대상 줄의 시작 위치까지 이동
while (cnt < n){
// 이전 줄로 이동
while (str < target_pos && *target_pos != DELIM)
--target_pos;
if (*target_pos == DELIM)
--target_pos, ++cnt;
else
break; // 문자열에 남은 줄이 부족하면 종료
}
if (str < target_pos)
target_pos += 2;
cout << target_pos << endl;
}
int main(void){
char *str1 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9"
"\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17"
"\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";
print_last_lines(str1, 14);
return 0;
}실행 결과
str12 str13 str14 str15 str16 str17 str18 str19 str20 str21 str22 str23 str24 str25
코드 설명
위 예제에서는 총 25줄로 구성된 문자열에서 마지막 14줄을 출력하도록 요청했습니다. 프로그램은 문자열 끝에서부터 줄바꿈 문자를 기준으로 거꾸로 14번 이동한 후, 그 위치부터 끝까지 출력합니다. 그 결과 str12부터 str25까지 정확히 14줄이 화면에 표시됩니다.
이 방식의 시간 복잡도는 O(L)입니다. 여기서 L은 문자열의 전체 길이입니다. 최악의 경우 문자열의 처음까지 탐색해야 할 수 있기 때문입니다. 공간 복잡도는 추가 메모리를 사용하지 않으므로 O(1)입니다.