문장의 단어 순서를 역으로 출력하는 프로그램

주어진 영어 문장을 입력받아, 단어들의 순서를 뒤집어 출력해야 한다. 단, 각 단어 사이에는 정확히 하나의 공백만 존재해야 하며, 입력에 포함된 다수의 공백은 모두 제거되어야 한다.

입력은 길이가 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) 조건이 먼저 실행되면서 flagtrue로 전환되기 전에 printf(" ")가 호출될 수 있다. 이로 인해 출력 결과에 불필요한 공백이 생기거나, 문제 조건에 어긋나는 형식이 나타난다.

정확한 처리를 위해서는 첫 단어인지 여부를 판단하기 위한 플래그를 초기에 true로 설정하고, 단어를 출력할 때만 false로 바꾸는 방식이 필요하다. 이렇게 하면 첫 단어는 공백 없이 출력되고, 이후 단어들은 공백을 포함하여 출력된다.

이러한 접근은 문자열 탐색과 조건 분기의 정밀함을 요구하므로, 반복문 내부의 조건 처리와 플래그 상태 관리는 매우 중요하다.

태그: string processing C++ reverse word order whitespace handling character array

9월 20일 10:30에 게시됨