ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ #16120 PPAP
    BOJ 2021. 1. 18. 19:21

    문제

    bryan은 PPAP를 좋아한다. bryan은 어떻게 하면 사람들에게 PPAP를 전파할 수 있을까 고민하던 중 PPAP 문자열이라는 것을 고안하게 되었다.

    PPAP 문자열은 문자열 P에서 시작하여, 문자열 내의 P를 PPAP로 바꾸는 과정을 반복하여 만들 수 있는 문자열로 정의된다. 정확하게는 다음과 같이 정의된다.

    • P는 PPAP 문자열이다.
    • PPAP 문자열에서 P 하나를 PPAP로 바꾼 문자열은 PPAP 문자열이다.

    예를 들어 PPAP는 PPAP 문자열이다. 또한, PPAP의 두 번째 P를 PPAP로 바꾼 PPPAPAP 역시 PPAP 문자열이다.

    문자열이 주어졌을 때, 이 문자열이 PPAP 문자열인지 아닌지를 알려주는 프로그램을 작성하여라.

    입력

    첫 번째 줄에 문자열이 주어진다. 문자열은 대문자 알파벳 P와 A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하이다.

    출력

    첫 번째 줄에 주어진 문자열이 PPAP 문자열이면 PPAP를, 아닌 경우 NP를 출력한다.

     


    소스코드(C언어)

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    char str[1001000];
    
    int main() {
    	scanf("%s", str);
    	int p = 0;
    
    	for (int i = 0; i < strlen(str); i++) {
    		if (str[i] == 'P')
    			p++;
    		else {
    			if (p >= 2 && str[++i] == 'P')
    				p--;
    			else {
    				printf("NP\n");
    				return 0;
    			}
    		}
    	}
    
    	if (p == 1)
    		printf("PPAP\n");
    	else
    		printf("NP\n");
    
    	return 0;
    }

     

    ※ 아래와 같이 stack으로 구현했더니 시간초과가 떴다.(Idea는 두 코드 모두 동일하다.)

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
    	char value;
    	struct NODE* next;
    }NODE;
    
    typedef struct {
    	struct NODE* top;
    }STACK;
    
    char str[1000100];
    void push(STACK* stack, char c);
    char pop(STACK* stack);
    void destroy(STACK* stack);
    int main() {
    	scanf("%s", str);
    	STACK* stack;
    	stack = (STACK*)malloc(sizeof(STACK));
    	stack->top = NULL;
    
    	for (int i = 0; i < strlen(str); i++) {
    		if (str[i] == 'P')
    			push(stack, str[i]);
    		else {
    			if (pop(stack) == 'P' && pop(stack) == 'P' && str[++i] == 'P')
    				push(stack, 'P');
    			else {
    				destroy(stack);
    				printf("NP\n");
    				return 0;
    			}
    		}
    	}
    
    	if (pop(stack) == 'P' && pop(stack) == 'C')
    		printf("PPAP\n");
    	else
    		printf("NP\n");
    
    	destroy(stack);
    	return 0;
    }
    
    void push(STACK* stack, char c) {
    	NODE* node;
    	node = (NODE*)malloc(sizeof(NODE));
    	node->value = c;
    	node->next = stack->top;
    	stack->top = node;
    }
    char pop(STACK* stack) {
    	NODE* node;
    	node = stack->top;
    
    	char tmp;
    	if (node) {
    		stack->top = node->next;
    		tmp = node->value;
    	}
    	else
    		tmp = 'C';
    
    	free(node);
    	return tmp;
    }
    void destroy(STACK* stack) {
    	NODE* node;
    	node = stack->top;
    
    	while (node) {
    		stack->top = node->next;
    		free(node);
    		node = stack->top;
    	}
    
    	free(stack);
    }

     

    'BOJ' 카테고리의 다른 글

    BOJ #2164 카드2  (0) 2021.01.18
    BOJ #10845 큐  (0) 2021.01.18
    BOJ #10799 쇠막대기  (0) 2021.01.17
    BOJ #1935 후위 표기식2  (0) 2021.01.17
    BOJ #9012 괄호  (0) 2021.01.17

    댓글

Designed by Tistory.