Algorythm/백준 BEAKJOON

[C] 백준 BEAKJOON 10773번: 제로

gapsoo 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] 느낀 점

 

문제 조건을 보고 처음에 배열을 활용해야 하나 싶었는데, 너무 복잡해져서 구현해낼 자신이 없었다.

그래서 다른 풀이 글을 찾아보았는데, 스택이라는 개념을 새롭게 알게 되었다.

개념 자체가 쉽지 않다고 느껴졌다. 그래도 자주 사용하다보면 익숙해지려나?

단순히 사용법에 익숙해져야 하는게 아니라, 자료구조에 대해서도 이해를 해야 하는 것 같았다...