[BEAKJOON] 9935_문자열폭발_C언어

SW 업무 관련/백준

[BEAKJOON] 9935_문자열폭발_C언어

WillBe_ 2017. 8. 4. 17:10

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


풀이

문자열의 중간을 특정 문자열과 같으면 없애는 문제이다. 왠지 문제가 백준 1406번 에디터문제와 비슷한 것 같아 스택을 2개 놓고 두 스택으로 문자를 옮겨가면서 비교하여 비슷한 문자열이 있으면 제거하면서 출력했는데....코드 길이도 길어지고.....제출하니 시간초과가 떳다...ㅎㅎ


그래서 스택을 하나로 쓰기로 결정!!

1. 우선 arr배열과 bomb 배열로 문자열을 입력받은 후 arr[bottom]배열이 bomb[0]과 같으면 arr[bottom]부터 bomb배열과 비교를 한다. 만약 같을 경우 arr배열을 인덱스 값에 bomb문자열 길이만큼 더해주어 폭탄이 정답을 저정하는 answer배열에 저장이 안 되게한다.


2. 그리고 cc44와 같이 c4는 위의 과정으로 없앨 수 있으나 맨 앞의c는 이미 정답 배열 answer에 저장이 되어있으며 중간의 c4를 제거 후 정답 배열에 c4가 저정된다. 이것을 없애기 위하여 answer의 마지막 문자와 bomb의 마지막 문자를 비교하여 같으면 비교해주어 정답 배열에서 폭탄 문자열을 제거해준다.



1번과정 수행 후 

arr       : mirkovC4nizCC44       -> 빨간색 표시는 폭탄 문자열과 같으므로 건너띈다.

answer : mikovnizc4                -> 정답배열에 저장된 문자열


2번과정 수행 후

answer : mikovnizc4                ->마지막 문자 4가 폭탄의 마지막 문자 4와 같으므로 검사를 해주어 제거

  해준다.


정답

answer : mikovniz


제출한 코드

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
#include <stdio.h>
char arr[1000005], answer[1000005], bomb[40];
int bomb_len,arr_bottom=-1,arr_top,answer_top=-1,flag;
 
void check_1(int location)
{
    int same = 0;
    for (int i = 0; i < bomb_len; i++)
    {
        if (arr[location + i] == bomb[i])
            same++;
    }
    if (same == bomb_len)
    {
        arr_bottom = arr_bottom +bomb_len;
        return;
    }
    return;
}
 
vod check_2(int location)
{
    int same = 0;
    for (int i = 0; i < bomb_len; i++)
    {
        if (answer[location - i] == bomb[bomb_len - 1-i])
            same++;
    }
    if (same == bomb_len)
    {
        answer_top = answer_top - bomb_len;
        return;
    }
 
    return;
}
 
int main()
{
    scanf("%s",arr);
    scanf("%s",bomb);
    arr_top = strlen(arr)-1;
    bomb_len = strlen(bomb);
    while(arr_bottom<arr_top)
    {
        if (arr[++arr_bottom] == bomb[0])
        {
            check_1(arr_bottom);
        }
        if (arr_bottom > arr_top) break;
        answer[++answer_top] = arr[arr_bottom];
        
        if (answer[answer_top] == bomb[bomb_len - 1])
        {
            check_2(answer_top);
        }
    }
 
    if (answer_top == -1)
    {
        printf("FRULA");
        return 0;
    }
 
    for(int i=0;i<=answer_top;i++)
        printf("%c",answer[i]);
    return 0;
}
cs















'SW 업무 관련 > 백준' 카테고리의 다른 글

[BEAKJOON] 1074_Z_C언어  (0) 2017.08.09
[BEAKJOON] 3055_탈출_C언어  (0) 2017.08.07
[BEAKJOON] 1992_쿼드트리_C언어  (0) 2017.08.02
[BAEKJOON] 2089_-2진수_C언어  (0) 2017.08.01
[BAEKJOON] 1107_리모컨_C언어  (1) 2017.08.01