SWLUG/λ°±μ€€ BEAKJOON

[C] λ°±μ€€ BEAKJOON 10773번: 제둜

waterproof 2023. 9. 20. 02:47

 

[C] λ°±μ€€ BEAKJOON 10773번: μ œλ‘œ

 

 

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

 

10773번: 제둜

첫 번째 쀄에 μ •μˆ˜ Kκ°€ 주어진닀. (1 ≤ K ≤ 100,000) 이후 K개의 쀄에 μ •μˆ˜κ°€ 1κ°œμ”© 주어진닀. μ •μˆ˜λŠ” 0μ—μ„œ 1,000,000 μ‚¬μ΄μ˜ 값을 가지며, μ •μˆ˜κ°€ "0" 일 κ²½μš°μ—λŠ” κ°€μž₯ μ΅œκ·Όμ— μ“΄ 수λ₯Ό μ§€μš°κ³ , 아닐 κ²½

www.acmicpc.net

 

 

 

 


[1] 문제

 

 

 

 

 


[2] μ •λ‹΅ 및 ν•΄μ„€

 

 

μ •λ‹΅ μ½”λ“œ

 

#include <stdio.h>
 
int cnt = 0;
int stack[100000];
 
void push(int n){
    stack[cnt] = n;
    cnt++;
}
 
void pop(){
    cnt--;
    stack[cnt] = 0;
}
 
int main()
{
    int inputNumber;
    int sum = 0;
    scanf("%d", &inputNumber);
    int data[inputNumber];
    for(int i=0; i<inputNumber; i++){
        scanf("%d", &data[i]);
        if(data[i]==0){
            pop();
        }else{
            push(data[i]);
        }
    }
    for(int i=0; i<cnt; i++){
        sum+=stack[i];
    }
    printf("%d\n", sum);
    return 0;
}

 

 

 

 

해석

 

이 μ½”λ“œλŠ” μŠ€νƒμ„ ν™œμš©ν•˜μ—¬ 0이 μž…λ ₯될 λ•Œλ§ˆλ‹€ pop을 μˆ˜ν–‰ν•˜κ³ ,

0이 μ•„λ‹Œ κ²½μš°μ—λŠ” pushλ₯Ό μˆ˜ν–‰ν•˜μ—¬ μŠ€νƒμ˜ 값을 μ‘°μž‘ν•œλ‹€.

그리고 λ§ˆμ§€λ§‰μ— μŠ€νƒμ— μžˆλŠ” 값듀을 λͺ¨λ‘ λ”ν•œ λ’€ κ·Έ 값을 좜λ ₯ν•œλ‹€.

 

 

1. int main(): ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘ 지점을 λ‚˜νƒ€λ‚Έλ‹€.

2. int inputNumber;: μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯ 받을 μ •μˆ˜μ˜ 개수λ₯Ό μ €μž₯ν•  λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

3. int sum = 0;: μŠ€νƒμ— μ €μž₯된 μˆ«μžλ“€μ˜ 합계λ₯Ό μ €μž₯ν•  λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

4. scanf("%d", &inputNumber);: μ‚¬μš©μžλ‘œλΆ€ν„° μ •μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ inputNumber에 μ €μž₯ν•œλ‹€.

5. int data[inputNumber];: 크기가 inputNumber인 λ°°μ—΄ dataλ₯Ό μ„ μ–Έν•œλ‹€. 이 배열은 μž…λ ₯된 μ •μˆ˜λ₯Ό μ €μž₯ν•  μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

6. for(int i=0; i<inputNumber; i++){...}: μž…λ ₯ 받은 숫자의 개수만큼 λ°˜λ³΅ν•œλ‹€.

7. scanf("%d", &data[i]);: μ‚¬μš©μžλ‘œλΆ€ν„° μ •μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ data[i]에 μ €μž₯ν•œλ‹€.

8. if(data[i]==0){...}else{...}: ν˜„μž¬ μž…λ ₯된 μˆ«μžκ°€ 0인지λ₯Ό κ²€μ‚¬ν•œλ‹€.

9. pop();: λ§Œμ•½ 0이면, pop ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μŠ€νƒμ—μ„œ 값을 μ œκ±°ν•œλ‹€.

10. else λΈ”λ‘μ—μ„œ push(data[i]);: 0이 μ•„λ‹ˆλ©΄, push ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μŠ€νƒμ— 값을 μΆ”κ°€ν•œλ‹€.

11. for(int i=0; i<cnt; i++){...}: ν˜„μž¬ μŠ€νƒμ— μ €μž₯된 κ°’λ“€μ˜ 합을 κ³„μ‚°ν•œλ‹€.

12. sum+=stack[i];: stack[i]에 μ €μž₯된 값을 sum에 λ”ν•œλ‹€.

13. printf("%d\n", sum);: κ³„μ‚°λœ 합을 좜λ ₯ν•œλ‹€.

14. return 0;: ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜κ³  μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.

 

 

 

 

 

μ½”λ“œ 좜처:

https://2018-start.tistory.com/121

 

[λ°±μ€€] 10773 제둜 (Cμ–Έμ–΄)

#include int cnt = 0; int stack[100000]; void push(int n){ stack[cnt] = n; cnt++; } void pop(){ cnt--; stack[cnt] = 0; } int main() { int inputNumber; int sum = 0; scanf("%d", &inputNumber); int data[inputNumber]; for(int i=0; i

2018-start.tistory.com

 

 

 

 


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

 

μŠ€νƒμ΄λž€?

μŠ€νƒμ˜ ꡬ쑰

 

μŠ€νƒ(stack)은 μ œν•œμ μœΌλ‘œ μ ‘κ·Όν•  μˆ˜ μžˆλŠ” λ‚˜μ—΄ κ΅¬μ‘°μ΄λ‹€. κ·Έ μ ‘κ·Ό λ°©λ²•μ€ μ–Έμ œλ‚˜ λͺ©λ‘μ˜ λμ—μ„œλ§Œ μΌμ–΄λ‚œλ‹€. λλ¨Όμ €λ‚΄κΈ° λͺ©λ‘(Pushdown list)이라고도 ν•œλ‹€.

μŠ€νƒμ€ ν•œ μͺ½ λμ—μ„œλ§Œ μžλ£Œλ₯Ό λ„£κ±°λ‚˜ λΊ„ μˆ˜ μžˆλŠ” μ„ ν˜• κ΅¬μ‘°(LIFO - Last In First Out)으둜 λ˜μ–΄ μžˆλ‹€. μžλ£Œλ₯Ό λ„£λŠ” κ²ƒμ„ 'λ°€μ–΄λ„£λŠ”λ‹€' ν•˜μ—¬ ν‘Έμ‰¬(push)라고 ν•˜κ³  λ°˜λŒ€λ‘œ λ„£μ–΄λ‘” μžλ£Œλ₯Ό κΊΌλ‚΄λŠ” κ²ƒμ„ νŒ(pop)이라고 ν•˜λŠ”데, μ΄λ•Œ κΊΌλ‚΄μ§€λŠ” μžλ£ŒλŠ” κ°€μž₯ μ΅œκ·Όμ— ν‘Έμ‰¬ν•œ μžλ£ŒλΆ€ν„° λ‚˜μ˜€κ²Œ λœλ‹€. μ΄μ²˜λŸΌ λ‚˜μ€‘에 λ„£μ€ κ°’이 λ¨Όμ € λ‚˜μ˜€λŠ” κ²ƒμ„ LIFO κ΅¬μ‘°λΌκ³  ν•œλ‹€.

이λ₯Όν…Œλ©΄, aλΆ€ν„° b와 cλ₯Ό μˆœμ„œλŒ€λ‘œ λ„£μ€ λ‹€μŒ μžλ£Œλ₯Ό ν•˜λ‚˜μ”© κΊΌλ‚΄λ©΄ cλΆ€ν„° b와 a의 μˆœμ„œλ‘œ λ‚˜μ˜€κ²Œ λœλ‹€. Sλ₯Ό μŠ€νƒ, xλ₯Ό λ°μ΄ν„° μš”μ†Œ(element)라고 ν•˜μž. κ·ΈλŸ¬λ©΄ μŠ€νƒμ—μ„œλŠ” μ•„λž˜μ™€ κ°™μ€ μ€‘μš”ν•œ μ—°μ‚°μ΄ μ‘΄μž¬ν•˜λŠ” κ²ƒμ„ μ•Œ μˆ˜ μžˆλ‹€.

- S.top(): μŠ€νƒμ˜ κ°€μž₯ μœ— 데이터λ₯Ό λ°˜ν™˜ν•œλ‹€. λ§Œμ•½ μŠ€νƒμ΄ λΉ„μ—ˆλ‹€λ©΄ 이 연산은 μ •μ˜λΆˆκ°€ μƒνƒœμ΄λ‹€.
- S.pop(): μŠ€νƒμ˜ κ°€μž₯ μœ— 데이터λ₯Ό μ‚­μ œν•œλ‹€. μŠ€νƒμ΄ λΉ„μ—ˆλ‹€λ©΄ μ—°μ‚° μ •μ˜λΆˆκ°€ μƒνƒœ.
- S.push(): μŠ€νƒμ˜ κ°€μž₯ μœ— λ°μ΄ν„°λ‘œ top이 κ°€λ¦¬ν‚€λŠ” 자리 μœ„μ—(top = top + 1) λ©”λͺ¨λ¦¬λ₯Ό 생성, 데이터 xλ₯Ό λ„£λŠ”λ‹€.
- S.empty(): μŠ€νƒμ΄ λΉ„μ—ˆλ‹€λ©΄ 1을 λ°˜ν™˜ν•˜κ³ ,그렇지 μ•Šλ‹€λ©΄ 0을 λ°˜ν™˜ν•œλ‹€.
λ˜ν•œ, μŠ€νƒμ—°μ‚°μ„ λͺ©λ‘(list) μ—°μ‚°μœΌλ‘œ ν‘œν˜„ν•  μˆ˜λ„ μžˆλ‹€.

- S.top(): S.retrieve(S.first())
- S.pop(): S.top(),S.delete(S.first())
- S.push():S.insert(x,pNull)
- S.empty():S.first()==pNull
μ»΄ν“¨ν„°μ—μ„œ ν¬μΈν„°λΌκ³  ν•˜λŠ” μžλ£Œμ˜ μœ„μΉ˜ ν‘œμ‹œμžμ™€ λ„£κ³  λΉΌλŠ” λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ μŠ€νƒμ„ μ΄μš©ν•œλ‹€. μ£Όλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμˆ˜μ˜ μ „달 λ“±μ— μ΄μš©λœλ‹€. LIFO의 νŠΉμ§•μ„ μ΄μš©ν•˜μ—¬ μ—­ν΄λž€λ“œ ν‘œκΈ°λ²•μ„ μ΄μš©ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μΈ ν¬μŠ€(Forth) λ“±μ—μ„œλ„ μ΄μš©λœλ‹€.

 

 

좜처:

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D

 

μŠ€νƒ - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전. μŠ€νƒμ˜ ꡬ쑰 μŠ€νƒ(stack)은 μ œν•œμ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλŠ” λ‚˜μ—΄ ꡬ쑰이닀. κ·Έ μ ‘κ·Ό 방법은 μ–Έμ œλ‚˜ λͺ©λ‘μ˜ λμ—μ„œλ§Œ μΌμ–΄λ‚œλ‹€. 끝먼저내기 λͺ©λ‘(Pushdown list)이라고도

ko.wikipedia.org

 

 

이외에 μ°Έκ³ ν•˜λ©΄ 쒋을 λΈ”λ‘œκ·Έ 자료:

https://olivertree-cs.tistory.com/entry/C%EC%96%B8%EC%96%B4-%EC%8A%A4%ED%83%9DStack-%EB%A9%94%EB%AA%A8%EB%A6%AC

 

[Cμ–Έμ–΄]μŠ€νƒ(Stack) λ©”λͺ¨λ¦¬

μŠ€νƒ λ©”λͺ¨λ¦¬ (LIFO, Last In Firtst Out) μŠ€νƒ λ©”λͺ¨λ¦¬λŠ” 각 ν•¨μˆ˜(mainν•¨μˆ˜λ„ ν•¨μˆ˜λ‹€)μ—μ„œ μ‚¬μš©ν•˜λŠ” 지역 λ³€μˆ˜λ“±μ„ μž„μ‹œμ μœΌλ‘œ μ €μž₯ν•˜λŠ” 곡간이닀. μŠ€νƒ λ©”λͺ¨λ¦¬μ˜ ν¬κΈ°λŠ” ν”„λ‘œκ·Έλž¨ λΉŒλ“œμ‹œ 결정이 λœλ‹€(함

olivertree-cs.tistory.com

 

 

 

 


[4] λŠλ‚€ 점

 

문제 쑰건을 보고 μ²˜μŒμ— 배열을 ν™œμš©ν•΄μ•Ό ν•˜λ‚˜ μ‹Άμ—ˆλŠ”λ°, λ„ˆλ¬΄ λ³΅μž‘ν•΄μ Έμ„œ κ΅¬ν˜„ν•΄λ‚Ό μžμ‹ μ΄ μ—†μ—ˆλ‹€.

κ·Έλž˜μ„œ λ‹€λ₯Έ 풀이 글을 μ°Ύμ•„λ³΄μ•˜λŠ”λ°, μŠ€νƒμ΄λΌλŠ” κ°œλ…μ„ μƒˆλ‘­κ²Œ μ•Œκ²Œ λ˜μ—ˆλ‹€.

κ°œλ… μžμ²΄κ°€ 쉽지 μ•Šλ‹€κ³  λŠκ»΄μ‘Œλ‹€. κ·Έλž˜λ„ 자주 μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ μ΅μˆ™ν•΄μ§€λ €λ‚˜?

λ‹¨μˆœνžˆ μ‚¬μš©λ²•μ— μ΅μˆ™ν•΄μ Έμ•Ό ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ, μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄μ„œλ„ 이해λ₯Ό ν•΄μ•Ό ν•˜λŠ” 것 κ°™μ•˜λ‹€...