본문 바로가기
개인 공부/알고리즘 트레이닝

[C언어/BOJ] BOJ 12605 단어순서 뒤집기

by 아메리카노와떡볶이 2020. 9. 11.
728x90
C언어 / 백준 12605번 단어순서 뒤집기

문제 자체는 어려운 문제가 아니지만, 문자열을 배우지 않았다는 가정하에 포인터를 이용하여 문제를 풀어보겠습니다.

생각하기 조금 까다로운 부분이 있어서 기억해두기 위해 기록을 남깁니다.

또한 포인터사용을 강제했을시에 바로 바로 풀이가 안떠올라서 배열을 통해 문제를 풀이 한뒤에 포인터로 바꾸는식으로 문제를 풀이했는데 포인터를 자유롭게 다룰 수 있도록 좀 더 연습이 필요하다고 느꼈습니다.

문제 및 입출력

스페이스로 띄어쓰기 된 단어들의 리스트가 주어질때, 단어들을 반대 순서로 뒤집어라. 각 라인은 w개의 영단어로 이루어져 있으며, 총 L개의 알파벳을 가진다. 각 행은 알파벳과 스페이스로만 이루어져 있다. 단어 사이에는 하나의 스페이스만 들어간다.

 

입력

첫 행은 N이며, 전체 케이스의 개수이다.

N개의 케이스들이 이어지는데, 각 케이스는 스페이스로 띄어진 단어들이다. 스페이스는 라인의 처음과 끝에는 나타나지 않는다. N과 L은 다음 범위를 가진다.

  • N = 5
  • 1 ≤ L ≤ 25

출력

각 케이스에 대해서, 케이스 번호가 x일때  "Case #x: " 를 출력한 후 그 후에 이어서 단어들을 반대 순서로 출력한다.

접근 및 풀이코드

문제에서 강조하듯이 핵심 포인트는 스페이스입니다. 스페이스가 단어와 단어를 구분짓기때문에 이것을 아이디어로 활용할수있습니다.

1번 예제를 가지고 알고리즘을 생각해보겠습니다. this is a test라는 문자열은 다음과 같은 형식으로 이루어지게 됩니다.

출력하고자 하는 문자열은 test a is this 입니다. 따라서 start point와 end point 변수를 선언하고 만나게 되는 공백에 따라 start point와 end point를 이동해가면서 출력하면 될것입니다.

 

1. 9번 인덱스 공백을 만나게 되었을때

10번 인덱스가 start포인트가 되고

13번 인덱스가 end 포인트가 됩니다. start~end 를 출력하고 ( =test 출력), 공백을 출력합니다.

 

2. 7번 인덱스 공백을 만나게 되었을때

8번을 출력하고 (=a 출력), 공백을 출력합니다.

 

 

3. 4번 인덱스 공백을 만나게 되었을때

5,6번 출력하고 (=is), 공백을 출력합니다.

 

위와 같은 그림에서 보충해야 할 점은

1. 마지막 this는 공백이 없는데 어떻게 출력할 것 인가?

2. 시작 포인트와 끝 포인트가 공백 포인트와 어떤 관계가 있는가? 입니다.

이 부분이 사실 문제를 해결하는데에 핵심적인 부분이므로, 각자가 해결하는 문제로 남기며 바로 코드를 작성해보겠습니다.

 

ver1. 배열을 사용한 풀이 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#pragma warning(disable:4996)
#include <stdio.h>
 
void initialize(char* ch);
int main() {
    char ch[100= { 0 }, * pch, * startp;
    pch = ch;
    int i = 0, pchidx = 0, case_num = 1;
    int startidx = 0, endidx = 0;
    int N;
    scanf("%d"&N);
    getchar();
 
    while (N--) {
 
        initialize(ch);
        pch = ch;
        pchidx = 0;
        scanf("%c", pch);
        while (*pch != '\n' && *pch != '.' && *pch != '!') {
            pch++;
            pchidx++;
            scanf("%c", pch);
        }
        printf("Case #%d: ", case_num);
        case_num++;
        endidx = pchidx - 1;
 
        for (i = pchidx - 1; i >= 0; i--) {
 
            if (i == 0) {
                startidx = i;
                for (int j = startidx; j <= endidx; j++) {
                    printf("%c", ch[j]);
                }
            }
            else if (ch[i] == ' ') {
                startidx = i;
                for (int j = startidx + 1; j <= endidx; j++) {
                    printf("%c", ch[j]);
                }
                printf(" ");
                endidx = startidx - 1;
            }
            
        }
        printf("\n");
    }
        return 0;
    
}
 
void initialize(char* ch) {
 
    for (int i = 0; i < 100; i++) {
        *ch = 0;
        ch++;
    }
}
 
cs

 

 

ver2. 포인터를 사용한 풀이코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#pragma warning(disable:4996)
#include <stdio.h>
 
void initialize(char* ch);
int main() {
    char ch[100= { 0 }, * pch,*startp;
    pch = ch;
    int i = 0,pchidx=0,case_num=1;
    int startidx = 0, endidx = 0;
    int N;
    scanf("%d"&N);
    getchar();
 
    while(N--){
        
        initialize(ch);
        pch = ch;
        pchidx = 0;
    scanf("%c", pch);
    while (*pch!='\n'&& *pch != '.'&& * pch != '!') {
        pch++;
        pchidx++;
        scanf("%c", pch);
    }
    printf("Case #%d: ", case_num);
    case_num++;
    endidx = pchidx-1;
 
    for (pch = ch+pchidx-1;pch>=ch; pch--) {
 
        if (pch == ch) {
            startidx = pch-ch;
            for (startp= ch+startidx ; startp <= ch+endidx; startp++) {
                printf("%c"*startp);
            }
            
        }
        else if (*pch== ' '){
            startidx = pch-ch;
            for (startp =ch+ startidx + 1; startp <=ch+ endidx; startp++) {
                printf("%c"*startp);
            }
            printf(" ");
            endidx = startidx - 1;
        }
    }
    printf("\n");
    }
    return 0;
}
 
void initialize(char* ch) {
 
    for (int i = 0; i < 100; i++) {
        *ch = 0;
        ch++;
    }
}
cs

 

 

 

728x90

댓글