SWLUG/λ°±μ€€ BEAKJOON

[C] λ°±μ€€ BAEKJOON 28278번: μŠ€νƒ 2

waterproof 2023. 9. 30. 21:02

https://www.acmicpc.net/problem/28278

 

28278번: μŠ€νƒ 2

첫째 쀄에 λͺ…λ Ήμ˜ 수 N이 주어진닀. (1 ≤ N ≤ 1,000,000) λ‘˜μ§Έ 쀄뢀터 N개 쀄에 λͺ…령이 ν•˜λ‚˜μ”© 주어진닀. 좜λ ₯을 μš”κ΅¬ν•˜λŠ” λͺ…령은 ν•˜λ‚˜ 이상 주어진닀.

www.acmicpc.net

 

 

 


[1] 문제

 

 

문제

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ„ κ΅¬ν˜„ν•œ λ‹€μŒ, μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” λͺ…령을 μ²˜λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λͺ…령은 총 λ‹€μ„― 가지이닀.

  1. 1 X: μ •μˆ˜ Xλ₯Ό μŠ€νƒμ— λ„£λŠ”λ‹€. (1 ≤ X ≤ 100,000)
  2. 2: μŠ€νƒμ— μ •μˆ˜κ°€ μžˆλ‹€λ©΄ 맨 μœ„μ˜ μ •μˆ˜λ₯Ό λΉΌκ³  좜λ ₯ν•œλ‹€. μ—†λ‹€λ©΄ -1을 λŒ€μ‹  좜λ ₯ν•œλ‹€.
  3. 3: μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  4. 4: μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  5. 5: μŠ€νƒμ— μ •μˆ˜κ°€ μžˆλ‹€λ©΄ 맨 μœ„μ˜ μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. μ—†λ‹€λ©΄ -1을 λŒ€μ‹  좜λ ₯ν•œλ‹€.

μž…λ ₯

첫째 쀄에 λͺ…λ Ήμ˜ 수 N이 주어진닀. (1 ≤ N ≤ 1,000,000)

λ‘˜μ§Έ 쀄뢀터 N개 쀄에 λͺ…령이 ν•˜λ‚˜μ”© 주어진닀.

좜λ ₯을 μš”κ΅¬ν•˜λŠ” λͺ…령은 ν•˜λ‚˜ 이상 주어진닀.

좜λ ₯

 

좜λ ₯을 μš”κ΅¬ν•˜λŠ” λͺ…령이 μ£Όμ–΄μ§ˆ λ•Œλ§ˆλ‹€ λͺ…λ Ήμ˜ κ²°κ³Όλ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1 

9
4
1 3
1 5
3
2
5
2
2
5

예제 좜λ ₯ 1 

1
2
5
3
3
-1
-1

 

 

 

 

 


[2] μ •λ‹΅ 및 해석

 

λ‚΄ 힘으둜 ν’€ 수 μ—†μ–΄μ„œ... κ΅¬κΈ€λ§ν•˜μ—¬ 문제λ₯Ό ν’€μ—ˆλ‹€.

 

 

# μ •λ‹΅ μ½”λ“œ

 

#include<stdio.h>

int stack[1000000], cnt = 0;

int main(){

    int N, order, num;

    scanf("%d", &N);

    for(int i = 0; i<N; i++){

        scanf("%d", &order);

        switch(order){

            case 1:

                scanf("%d", &num);

                stack[cnt] = num;

                cnt++;

                break;

            case 2:

                if(cnt == 0){

                    printf("-1\n");

                }

                else{

                    printf("%d\n", stack[cnt-1]);

                    cnt--;

                }

                break;

            case 3:

                printf("%d\n", cnt);

                break;

            case 4:

                if(cnt == 0){

                    printf("1\n");

                }

                else{

                    printf("0\n");

                }

                break;

            case 5:

                if(cnt == 0){

                    printf("-1\n");

                }

                else{

                    printf("%d\n", stack[cnt-1]);

                }

                break;

            default:

                printf("wrong order\n");

        }

    }

}

 

 

(μ½”λ“œ 좜처: https://blog.naver.com/everydayeffort/223220902826 )

 

 

# 해석

 

int stack[1000000], cnt = 0;: 크기가 1,000,000인 μ •μˆ˜ λ°°μ—΄ stackκ³Ό μŠ€νƒμ˜ ν˜„μž¬ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” cnt λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

int main() { ... }: ν”„λ‘œκ·Έλž¨μ˜ μ§„μž…μ μΈ main ν•¨μˆ˜λ₯Ό μ •μ˜λ‹€.

int N, order, num;: λ³€μˆ˜ N, order, num을 μ„ μ–Έν•œλ‹€. N은 λͺ…λ Ήμ˜ 수, orderλŠ” λͺ…λ Ή μ’…λ₯˜, num은 μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μ •μˆ˜μ΄λ‹€.

scanf("%d", &N);: μ‚¬μš©μžλ‘œλΆ€ν„° λͺ…λ Ήμ˜ 수 N을 μž…λ ₯λ°›λŠ”λ‹€.

for(int i = 0; i<N; i++) { ... }: λ°˜λ³΅λ¬Έμ„ 톡해 N번의 λͺ…령을 μ²˜λ¦¬ν•œλ‹€.

scanf("%d", &order);: 각 λͺ…λ Ήμ˜ μ’…λ₯˜λ₯Ό μž…λ ₯λ°›λŠ”λ‹€.

switch(order) { ... }: order에 따라 λ‹€λ₯Έ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.

case 1: ...: μ •μˆ˜λ₯Ό μŠ€νƒμ— λ„£λŠ” λͺ…령이닀.

scanf("%d", &num);: μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μ •μˆ˜ num을 λ°›λŠ”λ‹€.

stack[cnt] = num;: ν˜„μž¬ μŠ€νƒμ˜ cnt μœ„μΉ˜μ— num을 μ €μž₯ν•œλ‹€.

cnt++;: μŠ€νƒμ˜ 크기λ₯Ό 1 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.case 2: ...: μŠ€νƒμ—μ„œ μ •μˆ˜λ₯Ό λΉΌκ³  좜λ ₯ν•˜λŠ” λͺ…령이닀.

if(cnt == 0) { ... }: μŠ€νƒμ΄ λΉ„μ–΄μžˆμ„ 경우, -1을 좜λ ₯ν•œλ‹€.

else { ... }: μŠ€νƒμ—μ„œ κ°€μž₯ μœ„μ˜ μ •μˆ˜λ₯Ό λΉΌκ³  좜λ ₯ν•œ λ’€, μŠ€νƒμ˜ 크기λ₯Ό 1 κ°μ†Œμ‹œν‚¨λ‹€.

case 3: ...: μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•˜λŠ” λͺ…령이닀.

printf("%d\n", cnt);: ν˜„μž¬ μŠ€νƒμ˜ 크기λ₯Ό 좜λ ₯ν•œλ‹€.

case 4: ...: μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 좜λ ₯ν•˜λŠ” λͺ…령이닀.

if(cnt == 0) { ... }: μŠ€νƒμ΄ λΉ„μ–΄μžˆμ„ 경우, 1을 좜λ ₯ν•œλ‹€.

else { ... }: μŠ€νƒμ΄ λΉ„μ–΄μžˆμ§€ μ•Šμ„ 경우, 0을 좜λ ₯ν•œλ‹€.

case 5: ...: μŠ€νƒμ—μ„œ κ°€μž₯ μœ„μ˜ μ •μˆ˜λ₯Ό 좜λ ₯ν•˜λŠ” λͺ…령이닀.

if(cnt == 0) { ... }: μŠ€νƒμ΄ λΉ„μ–΄μžˆμ„ 경우, -1을 좜λ ₯ν•œλ‹€.

else { ... }: μŠ€νƒμ—μ„œ κ°€μž₯ μœ„μ˜ μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

default: ...: 잘λͺ»λœ λͺ…령일 경우 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

 

 

 


[3] λŠλ‚€ 점

 

 

switch 문을 μ‚¬μš©ν•˜μ—¬ 각 λͺ…령어에 λŒ€ν•œ 처리λ₯Ό λΆ„λ₯˜ν•œ 것이 μΈμƒκΉŠμ—ˆλ‹€.

 

(각 caseμ—μ„œ ν•΄λ‹Ήν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•˜κ³ , μž…λ ₯에 λ”°λ₯Έ 좜λ ₯을 μ œκ³΅ν–ˆμŒ.)

 

 


[4] μΆ”κ°€ ν•™μŠ΅

 

큐와 μŠ€νƒμ˜ κ°œλ…, 차이점: https://blog.naver.com/strictlife/223165240439

 

Cμ–Έμ–΄μ—μ„œ 큐와 μŠ€νƒ ν™œμš©ν•˜κΈ°: κΈ°λ³Έ κ°œλ…κ³Ό μ‚¬μš© 방법

μ•ˆλ…•ν•˜μ„Έμš”! μ˜€λŠ˜μ€ Cμ–Έμ–΄μ—μ„œ 큐(Queue)와 μŠ€νƒ(Stack)을 ν™œμš©ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€. 큐...

blog.naver.com

 

 

#μŠ€νƒμ„ μ‚¬μš©ν•˜λŠ” 방법

 

μŠ€νƒ(Stack)은 데이터λ₯Ό μ €μž₯ν•˜λŠ” 자료ꡬ쑰둜, λ§ˆμ§€λ§‰μœΌλ‘œ λ“€μ–΄μ˜¨ 데이터가 κ°€μž₯ λ¨Όμ € λ‚˜κ°€λŠ” (Last-In-First-Out, LIFO) 원칙을 λ”°λ₯Έλ‹€. 이것은 데이터λ₯Ό μ €μž₯ν•˜κ³  κ²€μƒ‰ν•˜λŠ” 데 효과적인 ꡬ쑰이닀. μ•„λž˜λŠ” μŠ€νƒμ„ μ‚¬μš©ν•˜λŠ” 기본적인 방법이닀.

 

 

 

1. μŠ€νƒμ˜ 생성:

 

- μŠ€νƒμ€ λ°°μ—΄ λ˜λŠ” μ—°κ²° 리슀트λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„λœλ‹€. 일반적으둜 배열을 μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

#define MAX_SIZE 100
int stack[MAX_SIZE];
int top = -1;

 

2. Push (데이터 μΆ”κ°€):

- μŠ€νƒμ— 데이터λ₯Ό μΆ”κ°€ν•œλ‹€.
- μŠ€νƒμ΄ 가득 μ°¨ 있으면 μ˜€λ²„ν”Œλ‘œμš°(Overflow)κ°€ λ°œμƒν•  수 μžˆλ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

void push(int data) {
    if (top < MAX_SIZE - 1) {
        stack[++top] = data;
    } else {
        printf("μŠ€νƒμ΄ 가득 μ°ΌμŠ΅λ‹ˆλ‹€.\n");
    }
}

 

 

3. Pop (데이터 μ œκ±°):

- μŠ€νƒμ—μ„œ 데이터λ₯Ό μ œκ±°ν•œλ‹€.

- μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ μ–Έλ”ν”Œλ‘œμš°(Underflow)κ°€ λ°œμƒν•  수 μžˆλ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

int pop() {
    if (top >= 0) {
        return stack[top--];
    } else {
        printf("μŠ€νƒμ΄ λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.\n");
        return -1; // λ˜λŠ” λ‹€λ₯Έ 값을 λ°˜ν™˜ν•˜μ—¬ μ–Έλ”ν”Œλ‘œμš°λ₯Ό μ•Œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.
    }
}

 

 

4. Top (맨 μœ„ 데이터 쑰회):

- μŠ€νƒμ˜ 맨 μœ„μ— μžˆλŠ” 데이터λ₯Ό μ‘°νšŒν•œλ‹€. (μ‚­μ œν•˜μ§€ μ•Šκ³ )

- μŠ€νƒμ΄ λΉ„μ–΄μžˆμ„ 경우 μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

int top() {
    if (top >= 0) {
        return stack[top];
    } else {
        printf("μŠ€νƒμ΄ λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.\n");
        return -1; // λ˜λŠ” λ‹€λ₯Έ 값을 λ°˜ν™˜ν•˜μ—¬ μ–Έλ”ν”Œλ‘œμš°λ₯Ό μ•Œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.
    }
}

 

 

5. μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ 확인:

- μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•œλ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

int isEmpty() {
    return top == -1;
}

 

 

6. μŠ€νƒμ˜ ν¬κΈ° ν™•μΈ:

- μŠ€νƒμ— ν˜„μž¬ μ €μž₯된 λ°μ΄ν„°μ˜ 개수λ₯Ό ν™•μΈν•œλ‹€.

 

μ˜ˆμ‹œ (Cμ–Έμ–΄):

int size() {
    return top + 1;
}

 

 

 


μ–΄λ ΅λ‹€...!