백준 10828번 문제를 풀어보았습니다.
백준 10828번: https://www.acmicpc.net/problem/10828
문제 내용은 아래와 같습니다.
이 문제는 stack과 queue 자료구조에 대한 기본적인 이해만 있으면 어렵지 않게 풀 수 있습니다. stack은 기본적으로 queue와는 반대로 후입선출(LIFO)의 방식을 가진 자료구조로, 쌓아둔 접시를 위에서부터 꺼내는 것을 생각하면 쉽습니다. 그래서 배열을 선언하고, 배열의 끝에 정수를 push하고 배열 끝에서 다시 정수를 pop하면서 이용할 수 있는 자료구조입니다.
어렵지 않으니 바로 코드부터 보겠습니다. 우선 STACK 구조체를 선언해줬는데요, 사실 그냥 메인 함수 내에서 top 변수와 stack 배열을 선언해서 사용해도 여기서는 stack을 하나만 쓰게 되기 때문에 크게 문제는 없지만, 그러면 함수를 호출할 때마다 인자가 하나 더 늘어나는 등의 번거로움이 있기도 하고, 이 코드가 확장된 프로그램에 사용될 것을 고려해서 구조체로 만들어주었습니다. 구조체 안에는 현재 top의 위치를 표현하는 top 변수와 정수들을 담을 list 배열을 넣어주었습니다. list 배열 크기는 명령이 모두 push 명령일 수 있으므로, 명령의 수의 최댓값인 10,000으로 설정했습니다.
그리고 함수는 총 5개를 선언했는데, 문제에서 제시된 명령들을 각각 하나의 함수로 만들었다고 생각하시면 됩니다. push와 pop 함수만 stack 인자를 포인터로 받는 이유는 stack 내부에 변화가 생기는 함수이기 때문입니다.
함수를 하나씩 살펴보면 우선 empty() 함수에서는 이미 만들어둔 size 함수의 리턴값이 0보다 작거나 같은지를 확인하여 그렇다면 1을 아니라면 0을 리턴하게 됩니다. boolean 값이지만 리턴 타입은 int로 변환되기 때문에 true는 1으로 false는 0으로 반환되게 되는 것입니다. size() 함수에서는 top 값을 반환하는데요, top 값은 아래 코드들의 진행 흐름을 보면 알 수 있겠지만, list 내 요소들의 개수와 동일합니다. 따라서 추후 top을 출력해야 하거나 사용해야 하는 일이 있으면 top - 1 인덱스를 사용해야 합니다.
push() 함수는 리턴값 없이 입력받은 n을 list의 top index에 넣어주고 top을 하나 증가시킵니다. pop() 함수에서는 현재 top - 1 인덱스에 있는 값을 리턴하면서 top을 하나 감소시킵니다. 즉 배열 내 요소 하나가 줄었다는 의미입니다. 하지만 empty 함수를 통해 배열이 비어있는 것을 확인한다면 -1을 리턴합니다. top() 함수는 pop() 함수와 동일하지만 배열 내 요소를 삭제하지 않고 top 정수를 리턴만 합니다.
이렇게 만든 함수들을 이용하여, main 함수를 진행시킵니다. 우선 명령의 개수인 N을 받아 그만큼 반복하는 반복문을 만듭니다. 반복문 안에서 문자열을 하나씩 입력받아서 명령을 읽은 후 swith case문으로 각각의 명령을 구분하여 실행시킵니다. 여기서 명령이 총 5가지가 있는데, push와 pop을 제외하고는 모두 시작하는 알파벳이 다르므로, 효율을 위해서 첫 문자만 읽어서 명령을 실행시킵니다. 이는 문제에서 문제에 나와있지 않은 명령이 주어지는 경우가 없다는 조건을 제시했기 때문에 가능한 일이라는 점에 주의하셔야 합니다. 그리고 push와 pop의 경우는 다시 두 번째 문자를 비교하여 어떤 명령을 실행시켜야 할지를 결정합니다. push 명령을 제외하고는 함수의 리턴값을 출력해 주면 됩니다. 하지만 push 함수의 경우 주어진 정수 X도 파악해야 하기 때문에, 한 번 더 정수를 입력받아주고, 정수와 함께 push 함수를 실행시켜주기만 하면 됩니다.
#include <stdio.h>
typedef struct STACK {
int top;
int list[10000];
} Stack;
int empty(Stack stack);
int size(Stack stack);
void push(Stack *stack, int n);
int pop(Stack *stack);
int empty(Stack stack) {
return (size(stack) <= 0);
}
int size(Stack stack) {
return (stack.top);
}
void push(Stack *stack, int n) {
(stack->list)[(stack->top)++] = n;
}
int pop(Stack *stack) {
if (empty(*stack))
return -1;
return (stack->list)[--(stack->top)];
}
int top(Stack stack) {
if (empty(stack))
return -1;
return (stack.list)[stack.top - 1];
}
int main () {
int N;
scanf("%d", &N);
Stack stack;
stack.top = 0;
char input[15];
for (int i = 0; i < N; i++) {
scanf("%s", input);
switch (input[0]) {
case 's':
printf("%d\n", size(stack));
break;
case 'e':
printf("%d\n", empty(stack));
break;
case 't':
printf("%d\n", top(stack));
break;
default:
if (input[1] == 'u') {
int n;
scanf("%d", &n);
push(&stack, n);
} else {
printf("%d\n", pop(&stack));
}
}
}
}
'개발 언어 및 알고리즘 기초 > C언어로 푸는 백준' 카테고리의 다른 글
[백준 10699번/C언어] 오늘 날짜 풀이 (0) | 2024.04.02 |
---|---|
[백준 1012번/C언어] 괄호 풀이 (0) | 2024.03.22 |
[백준 1260번/C언어] 미로 탐색, BFS로 풀이 (0) | 2024.03.20 |
[백준 1181번/C언어] 단어 정렬, hash table과 구조체로 풀이 (0) | 2024.03.18 |
[백준 10989번/C언어] 수 정렬하기 3, 배열을 활용한 풀이 (0) | 2024.03.17 |