프로그래밍 알고리즘

[정올 1141] 불쾌한 날

꾸준한사람 2022. 12. 21. 23:10
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=421&sca=99&sfl=wr_hit&stx=1141 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

struct cow 
{
	int idx;
	int height;
};

cow st1[80010], st2[180010];
int sp1, sp2, N;
unsigned long long sum;

void push_back(cow C)
{
	st1[sp1++] = C;
}
void push_back2(cow C)
{
	st2[sp2++] = C;
}
cow pop()
{
	cow empty;
	empty.height = empty.idx = -1;
	if (sp1 != 0)	return st1[--sp1];
	else			return empty;
}
cow pop2()
{
	cow empty;
	empty.height = empty.idx = -1;
	if (sp2 != 0)	return st2[--sp2];
	else			return empty;
}

void Input()
{
	scanf("%d", &N);
	cow C;
	//역순으로 스택에 넣는다
	for (int i = N-1; i >= 0; i--)
	{
		C.idx = i;
		scanf("%d", &C.height);
		st1[i] = C;
	}
	sp1 = N;
}
void Check()
{
	cow cowRight, cowLeft; //역순으로 스택에 넣었으니, 오른쪽이 먼저 넣은 것

	while (sp1)
	{
		cowRight = pop();
		cowLeft = pop();
		if (cowLeft.height == -1)
		{//전부 다 계산해서 넣는다.
			cow keepCow;
			while (sp2)
			{
				keepCow = pop2();
				sum += keepCow.idx;
			}
		}
		else if (cowLeft.height >= cowRight.height)
		{
			//sum += cowRight.idx - cowLeft.idx;
			//이전에 저장된 애들 중에서도 있는 지 확인
			cow keepCow;
			while (sp2)
			{
				keepCow = pop2();
				if (cowLeft.height >= keepCow.height)
				{//keep 된 놈보다 크면, 계산
					sum += keepCow.idx - cowLeft.idx - 1;
				}
				else
				{//아니면 다시 넣음
					push_back2(keepCow);
					break;
				}
			}
			push_back(cowLeft);
		}
		else
		{
			push_back2(cowRight);
			push_back(cowLeft);
		}
	}
}

int main(void)
{
	Input();
	Check();
	printf("%lld\n", sum);

	return 0;
}
반응형

'프로그래밍 알고리즘' 카테고리의 다른 글

[정올 1157] 버블정렬  (0) 2022.12.30
[정올 1146] 선택정렬  (0) 2022.12.29
[정올 1108] 페이지 전환  (0) 2022.12.21
[정올 1105] 수식 계산기2  (0) 2022.12.17
[정올 1102] 스택 (stack)  (0) 2022.12.17