프로그래밍/백준(BOJ)

[백준(BOJ) / C][Silver Ⅳ] 10773번 : 제로

데굴데굴이 2024. 1. 4. 21:03
반응형

문제

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

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net


풀이

매 컴파일 마다 배열의 숫자가 달라지므로 동적할당을 이용하였습니다.

숫자가 배열에 들어갈때마다 현재 배열의 위치가 어디인지 확인하는 변수를 만들었고 숫자가 나가고 들어갈떄마다

1를 더하거나 뺐습니다.

 

Queue 를 생각하고 풀면 쉽게 풀리는 문제입니다.


소스코드

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int length = 0, num = 0, result = 0, cur = 0;
	int* arr;
	
	scanf("%d", &length);
	
	arr = (int*)malloc(sizeof(int)*length);
	
	for(int i = 0; i < length; i++)
	{
		scanf("%d", &num);
		
		// 만약 배열에 숫자가 하나 이상이 있고 0을 입력했다면
		// 가장 최근에 넣은 숫자를 제거합니다.
		if(num == 0 && cur != 0)
		{
			// 현재 cur은 입력받은 후 비어있는 곳을 가르키기 떄문에
			// cur-1 이 제일 최근에 입력된 숫자 입니다.
			arr[cur-1] = 0;
			cur--;
			continue;
		}
		
		// 가르키는 곳에 숫자를 넣고 다음 위치에 넣기 위해 
		// cur++를 합니다.
		arr[cur] = num;
		cur++;
	}
	
	// 입력된 숫자만큼 result에 값을 넣습니다.
	for(int i = 0; i <= cur; i++)
	{
		result+=arr[i];
	}
	
	printf("%d", result);
	free(arr);
	return 0;
}
반응형