문제 개요
이 문제에서는 하나의 문자열이 주어지며, 문자열을 특정 규칙에 따라 출력해야 합니다. 두 개 이상의 문자가 서로 연속(시퀀스)되어 있다면 같은 줄에 함께 출력하고, 그렇지 않은 경우에는 줄바꿈을 하여 다른 줄에 출력하는 것이 핵심입니다.
예제를 통해 개념을 더 쉽게 이해해 보겠습니다.
입력 : abcxstk
출력 :
abc
x
st
k
설명
abc는 서로 연속된 문자들이므로 한 줄에 함께 출력됩니다. 그다음 문자인 x는 앞의 'c'와 연속 관계가 아니므로 여기서 줄바꿈이 발생합니다. 다음 문자 s 역시 x와 연속되지 않으므로 새로운 줄에서 시작합니다. 그다음 t는 s와 연속된 문자이므로 s와 같은 줄에 이어서 출력되고, 마지막 k는 t와 연속되지 않으므로 줄바꿈 후 출력됩니다.
접근 방법
해결 방법은 간단합니다. 문자열의 각 문자를 바로 앞의 문자와 비교하면서 순회합니다.
- 현재 문자가 이전 문자보다 1 크거나 1 작으면(즉, 알파벳 순서상 인접하면) 연속된 것으로 판단하여 그대로 출력합니다.
- 그렇지 않다면 줄바꿈(
\n)을 먼저 출력한 뒤 현재 문자를 출력합니다.
첫 번째 문자는 비교 대상이 없으므로 항상 그대로 출력하면 됩니다.
구현 예제
위 로직을 바탕으로 C++ 프로그램을 작성해 보겠습니다.
#include <iostream>
using namespace std;
int main(){
string str = "stukfrpq";
cout << str[0];
for (int i=1; str[i]!='\0'; i++){
if ((str[i] == str[i-1]+1) || (str[i] == str[i-1]-1))
cout << str[i];
else
cout << "\n" << str[i];;
}
return 0;
}
출력 결과
stu
k
f
r
pq
코드 분석
첫 문자 s는 무조건 출력됩니다. 이후 t는 's'+1과 같으므로 연속으로 판정되어 같은 줄에 출력되고, u도 't'+1이므로 함께 출력되어 "stu"가 완성됩니다. k는 'u'와 연속 관계가 아니므로 새 줄에 출력되고, f, r 역시 각각 앞 문자와 인접하지 않아 줄바꿈 후 출력됩니다. 마지막 p와 q는 서로 연속되므로 "pq"로 한 줄에 출력됩니다.
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 없이 제자리에서 처리할 수 있는 효율적인 방법입니다.