[BEAKJOON] 1251_단어 나누기_C언어

SW 업무 관련/백준

[BEAKJOON] 1251_단어 나누기_C언어

WillBe_ 2017. 9. 8. 19:53

https://www.acmicpc.net/problem/1251


풀이


1. 3등 분으로 하기 위하여 문자열 범위 안에서 2개의 위치를 정해주어야 한다. 그래서 2중 for문을 사용하였다.


2. 범위를 지정하는 for문의 변수 i, j는 i와 j는 서로 같아도 안 되며, i<j또는 j<i 둘 중 하나만 탐색해주면 되기 때문에 if(i>=j) continue를 사용하였다.


3. 이렇게 되면 인덱스 0~i, i+1 ~ j, j+1 ~문자의 길이 len, 3개의 등분으로 구분이 가능하다. 이 범위에서 문자들을 앞뒤로 바꾸어주면 된다.


4. 여기서 가장 중요한 부분 같아. 사전순으로 가장 앞서있는 단어를 찾는 부분이다.

answer는 현재까지 사전순으로 앞서 있는 단어이다.

앞부터 비교하며 현재 찾은 것보다 사전순으로 큰 값이 먼저 나오면 사전순으로 늦은 문자라 return 0

큰 값이 늦게 나오면 사전 순으로 앞서는 것으로 판단하며 return 1을 리턴하여 answer 배열을 갱신해준다.


1
2
3
4
5
6
7
8
9
10
11
12
int compare()
{
    for (int i = 0; i < len; i++)
    {
        if (copy[i] < answer[i])//사전순으로 앞 섬
            return 1;
        else if(copy[i] > answer[i])
            return 0;
    }
    return 0;
}

c


제출 코드

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <string.h>
char arr[60], copy[60], answer[60];
int len;
void COPY(char *char *);
void reverse(int x, int y);
int compare();
 
int main()
{
    scanf("%s",arr);
    len = strlen(arr);
 
    for (int i = 0; i < len; i++)
        answer[i] = 'a'+ 26;
 
    for (int i = 0; i < len-1; i++)
    {
        for (int j = i ; j < len-1; j++)
        {
            if (i >= j)
                continue;
 
            COPY(copy, arr);
            reverse(i, j);
            if (compare())
            {
                COPY(answer, copy);
            }
        }
    }
            printf("%s\n",answer);
    return 0;
}
 
int compare()
{
    for (int i = 0; i < len; i++)
    {
        if (copy[i] < answer[i])
            return 1;
        else if(copy[i] > answer[i])
            return 0;
    }
    return 0;
}
 
void COPY(char * C, char * Cod)
{
    for (int i = 0; i < len; i++)
        C[i] = Cod[i];
}
 
void reverse(int x, int y)
{
    char temp;
    for (int i = 0; i < (x+1)/2; i++)//
    {
        temp = copy[i];
        copy[i] = copy[x - i];
        copy[x - i] = temp;
    }
 
    for (int i = 0; i < (y-x)/ 2; i++)//
    {
        temp = copy[x + 1 + i];
        copy[x + 1 + i] = copy[y - i];
        copy[y - i] = temp;
    }
 
    for (int i = 0; i < (len-y)/ 2; i++)//
    {
        temp = copy[y + 1 + i];
        copy[y + 1 + i] = copy[len - 1 - i];
        copy[len - 1 - i] = temp;
    }
}
cs