10773: 제로
2022. 4. 3. 15:00ㆍC언어/백준
-Class2 : Silver 4
https://www.acmicpc.net/problem/10773
10773번: 제로
첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경
www.acmicpc.net
-결과
-코드
#include <stdio.h>
#include <string.h>
int main() {
int k, a;
int top = 0;
long long int n = 0;
int stack[100001];
scanf("%d", &k);
for (int i = 0; i < k; i++) {
scanf("%d", &a);
if (a > 0) {
top += 1;
stack[top] = a;
n += a;
}
else if (a == 0) {
n -= stack[top];
stack[top] = 0;
top -= 1;
}
}
printf("%d", n);
}
-풀이
이 문제는 자료구조에서 배운 스택의 개념을 이용해서 풀 것이다.
스택(Stack)
스택은 Last in First Out (LIFO) 구조로, 프링글스 통과 같은 구조이다. 즉, 한 쪽 끝에서만 자료를 넣다 뺐다 할 수 있는 자료구조이다.
먼저 스택에서 제일 위에 있는 데이터인 top를 우리는 0으로 가정하고 갈 것이다.
배열의 크기는 첫 번째 줄에 주어지는 정수 k가 십만 이하라고 문제에서 가정하므로 십만1로 잡는다.
먼저 k를 입력받고 반복문을 실행한다.
그 반복문은 0이 아닌 정수 a를 입력받으면, 배열 스택의 top에 a가 저장되고 top += 1이 되도록 한다. 또 합인 n에 a값을 더한다.
만약 입력받은 a가 0이라면, n에서 직전에 입력받았던 a인 top를 빼고 배열 스택의 top도 0으로 리셋하고 top -= 1을 한다.
'C언어 > 백준' 카테고리의 다른 글
1436: 영화감독 숌 (0) | 2022.05.01 |
---|---|
1181: 단어 정렬 (0) | 2022.05.01 |
1018: 체스판 다시 칠하기 (0) | 2022.05.01 |
9012: 괄호 (0) | 2022.04.03 |
1094번: 막대기 (0) | 2022.04.03 |