-
BOJ #16120 PPAPBOJ 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