티스토리 뷰

#include <stdio.h>
#define M 1000000

typedef struct Stack {
	int top;
	char arr[M];
}Stack;

int isEmpty(Stack *s) { return s->top == 0;} //스택 비었는가? 
void push(Stack *s, char e) {s->arr[s->top++] = e;} //스택 넣기 
char pop(Stack *s) {return s->arr[--s->top];} //스택 꺼내기 
int cnt(Stack *s) {return s->top;} //스택의 요소 개수 
char peek(Stack *s) {return s->arr[s->top-1];} //가장 마지막에 들어간것 
	
int main(void) {
	char c[M] = {0};
	scanf("%s", c); //문자열 입력 
	Stack s;
	s.top = 0;
	int i=0;
	int flag = 0; 
	while(c[i] != '\0') { //Null 문자가 오면 반복문 종료 
		if(c[i] == 'P') { //P일 경우 
			if(isEmpty(&s)) push(&s, c[i]); //스택이 비어있으면 넣고 
			else if(peek(&s) == 'P') push(&s, c[i]); //가장 마지막에 들어간 것이 P여도 넣고 
			else { //가장 마지막이 A일 경우 스택의 요소 두개를 뺀다 
				pop(&s);  //PPAP -> P이므로 
				pop(&s); //PPA(스택) + P(비교하는거); 여기선 스택에서 2개를 빼고, 비교하는 것을 집어넣지 않으면 PPAP => P 을만들수 있다. 
			}
		}
		else if(c[i] == 'A') { //비교하는게 A일 경우 
			if(cnt(&s) < 2) { //PPAP문자열을 만들려면 반드시 스택에 P 2개는 스택에 있어야 한다.
				flag = 1; //A를 스택에 넣지 못하여 끝났음을 나타내는 플래그이다. 
				break; //더 이상 반복을 할 필요가 없다 
			}  else { //P가 스택에 이미 2개이상이면 
				push(&s, c[i]); //스택에 집어넣는다 
			}
		}
		i++;
	}
	
	if(cnt(&s) == 1 && peek(&s) == 'P' && !flag) printf("PPAP");
	else printf("NP");
}

 

 

풀이 : 스택

 

아래의 C++ 코드를 C언어로 바꾸었습니다.

 

https://h202.tistory.com/229

 

c++ 16120번 PPAP (백준)

#include #define M 1000000 class Stack { //Stack을 클래스로 private: int top; char arr[M]; public: Stack() : top(0){} bool isEmpty() { return top == 0;} //스택 비었는가? void push(char e) {arr[top++] = e;} //스택 넣기 char pop() {return arr[

h202.tistory.com

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함