| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 일차방정식활용
- 다항식미분
- 다항식추론
- 비킬러
- 다항함수미분
- 수능대비
- 영재고코딩
- 중학생코딩과외
- 영재수학
- SW-AI추천인재전형
- 굿쌤수학
- 구경호T
- 굿쌤과외
- 학생풀이
- KMA수학
- 수능수학전문
- 공통수학2
- 영재고SWAI대비
- SW-AI전형
- 고3수학과외
- 수학과외
- 대전SW과외
- 대전굿쌤과외
- 준킬러문제
- 수2
- SW-AI 평가과제
- 대전수학과외
- 카이스트수학
- 대전코딩과외
- 수능수학
Archives
- Today
- Total
대전 카이스트 굿쌤 개인과외 (수능수학 | 소프트웨어)
스택(Stack) 자료구조 완전 이해 — 백준 28278번 스택 2로 배우는 구현 본문
반응형
📘 1️⃣ 스택이란?
Stack(스택) 은 LIFO (Last In, First Out) 구조를 가지는 자료구조입니다.
즉, 마지막에 들어온 데이터가 가장 먼저 나가는 구조죠.
🧩 예시로 생각해보면:
접시를 한 장씩 쌓아올릴 때,
맨 위의 접시(마지막으로 쌓은 것)부터 꺼내야 합니다.
이것이 바로 스택의 작동 원리입니다.
🧮 기본 연산
연산설명
| push(X) | 데이터를 스택에 삽입 |
| pop() | 스택의 맨 위 데이터를 제거하고 반환 |
| top() | 스택의 맨 위 데이터를 단순히 확인 |
| size() | 스택에 쌓인 데이터 개수 확인 |
| empty() | 스택이 비어있는지 확인 (1: 비었음, 0: 안 비었음) |
⚙️ 2️⃣ 백준 28278번 문제 개요
문제 이름: 스택 2
문제 링크: https://www.acmicpc.net/problem/28278
알고리즘 분류: 자료구조 / 스택
📖 문제 설명
정수를 저장하는 스택을 구현하고, 다음 다섯 가지 명령을 처리하는 프로그램을 작성하시오.
명령설명
| 1 X | 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000) |
| 2 | 스택이 비어 있지 않으면 맨 위의 정수를 빼고 출력, 비었으면 -1 |
| 3 | 스택에 들어 있는 정수의 개수를 출력 |
| 4 | 스택이 비어 있으면 1, 아니면 0 출력 |
| 5 | 스택이 비어 있지 않으면 맨 위의 정수를 출력, 비었으면 -1 |
📥 입력
- 첫째 줄에 명령의 수 N (1 ≤ N ≤ 1,000,000)
- 다음 줄부터 N개의 명령이 한 줄씩 주어짐
📤 출력
- 출력이 필요한 명령이 있을 때마다 결과를 한 줄씩 출력
💡 예제
입력
9
4
1 3
1 5
3
2
5
2
2
5
출력
1
2
5
3
3
-1
-1
🧠 3️⃣ 문제 접근 방식
이 문제는 스택 기본 구현 문제지만,
입력의 크기가 최대 100만 줄까지 들어오기 때문에
입출력 속도를 반드시 최적화해야 합니다.
동적 메모리 할당보다 배열 기반 스택이 훨씬 효율적 입니다.
💻 4️⃣ C언어 코드 구현
#include <stdio.h>
#define STACK_MAX 1000000
void push_stack(int* stack, int* top_idx, int x);
void pop_stack(int* stack, int* top_idx);
void top_stack(int* stack, int top_idx);
int stack[STACK_MAX];
int main () {
int N;
int i;
int top_idx = -1;
scanf("%d", &N);
for (i = 0; i < N; i++) {
int cmd;
scanf("%d", &cmd);
switch (cmd) {
case 1:
// push
int x;
scanf("%d", &x);
push_stack(stack, &top_idx, x);
break;
case 2:
// pop
pop_stack(stack, &top_idx);
break;
case 3:
// size
printf("%d\n", top_idx + 1);
break;
case 4:
// empty
if (top_idx == -1)
printf("1\n");
else
printf("0\n");
break;
case 5:
// top
top_stack(stack, top_idx);
break;
}
}
}
// push 함수: 스택에 값 삽입
void push_stack(int* stack, int* top_idx, int x) {
stack[*top_idx + 1] = x;
(*top_idx)++;
}
// pop 함수: 스택에서 값 제거 후 출력
void pop_stack(int* stack, int* top_idx) {
if (*top_idx > -1) {
printf("%d\n", stack[*top_idx]);
(*top_idx)--;
} else {
printf("-1\n");
}
}
// top 함수: 스택의 맨 위 값 출력
void top_stack(int* stack, int top_idx) {
if (top_idx > -1)
printf("%d\n", stack[top_idx]);
else
printf("-1\n");
}
반응형
'소프트웨어 > 자료구조와알고리즘' 카테고리의 다른 글
| 큐(Queue) 자료구조 | 백준 18258번 문제 (0) | 2025.11.01 |
|---|