주어진 영어 문장을 입력받아, 단어들의 순서를 뒤집어 출력해야 한다. 단, 각 단어 사이에는 정확히 하나의 공백만 존재해야 하며, 입력에 포함된 다수의 공백은 모두 제거되어야 한다.
입력은 길이가 500,000을 넘지 않는 한 줄의 문자열로 주어지며, 단어는 영문자(대소문자 구분)로 구성되며, 여러 개의 공백으로 분리된다.
출력은 단어 순서가 뒤집힌 문장이며, 단어 간 공백은 정확히 하나만 유지한다.
예제 입력:
Hello World Here I Come
예제 출력:
Come I Here World Hello
다음은 올바른 구현 예시이다:
#include <cstdio>
#include <cstring>
int main() {
char input[500005];
gets(input);
int len = strlen(input);
bool firstWord = true;
for (int i = len - 1; i >= 0; --i) {
if (input[i] == ' ' && i + 1 < len && input[i + 1] != ' ') {
// 현재 위치가 공백이고, 다음 문자가 단어 시작일 경우
if (!firstWord) {
printf(" ");
}
// 단어 출력
for (int j = i + 1; j < len && input[j] != ' '; ++j) {
printf("%c", input[j]);
}
firstWord = false;
} else if (i == 0 && input[i] != ' ') {
// 첫 번째 단어 처리 (맨 앞의 단어)
if (!firstWord) {
printf(" ");
}
for (int j = i; j < len && input[j] != ' '; ++j) {
printf("%c", input[j]);
}
}
}
printf("\n");
return 0;
}
위 코드는 단어를 뒤에서부터 찾아내며, 각 단어를 공백을 기준으로 추출하고, 출력 시 처음 단어 이후에는 공백을 추가하여 형식을 맞춘다.
오류가 발생한 코드에서는 flag 변수의 조건 로직이 잘못 설정되어 있어, 첫 단어 출력 시에도 공백이 삽입되는 문제가 발생한다. 특히 if (!flag) 조건이 먼저 실행되면서 flag가 true로 전환되기 전에 printf(" ")가 호출될 수 있다. 이로 인해 출력 결과에 불필요한 공백이 생기거나, 문제 조건에 어긋나는 형식이 나타난다.
정확한 처리를 위해서는 첫 단어인지 여부를 판단하기 위한 플래그를 초기에 true로 설정하고, 단어를 출력할 때만 false로 바꾸는 방식이 필요하다. 이렇게 하면 첫 단어는 공백 없이 출력되고, 이후 단어들은 공백을 포함하여 출력된다.
이러한 접근은 문자열 탐색과 조건 분기의 정밀함을 요구하므로, 반복문 내부의 조건 처리와 플래그 상태 관리는 매우 중요하다.