SW/Algorithm

스택활용하기 훈련문제

Gangdor 2021. 7. 13. 13:49
반응형

문제

1. N개의 건물 높이가 주어진다. (최대 80000)

2. 건물옥상에서 좌에서 우측 방향으로만 바라볼 수 있다.

3. 높이가 같거나 높으면 옥상을 볼 수 없다.

4. 이때 옥상을 볼 수있는 최대의 합을 구하라

 

접근

N의 갯수가 최대 8만이기 때문에 i번째 건물'이' 볼 수 있는 옥상을 이중 루프로 비교 탐색을 수행할시 시간복잡도는 O(N제곱)이다. 때문에 시간이 초과될 수 있다.

i번째 건물'을' 볼 수 있는 건물을 탐색해야한다. 시간 복잡도 O(N).

1. i번째 건물을 볼 수 있는 건물을 스택에 저장한다.

2. i+1번째 건물을 볼 수 있으면 pop하지 않는다.

3. i+1번째 건물을 볼 수 없다면 pop한다. 스택에 있는 전체 건물 후보에 대해 2,3을 판단한다.

4. 스택에 남아있는 건물 후보가 i번째 건물을 볼 수 있는 건물이다.

5. 현재 건물을 스택에 push한다.

6. 이를 반복한다.

 

#include <stdio.h>

int N;
long long tower[80000+10];
int stack[80000+10];
int sp = -1;
long long sum=0;

void input()
{
	scanf("%d",&N);
	for(int i=0; i<N; i++)
	{
		scanf("%lld",&tower[i]);	
	}
}

int main() {
	input();
	/*solution*/
	
	for(int i=0; i<N; i++){ //건물 선택 index
		while(sp>=0){
			if(tower[i]>=stack[sp]) sp--; // 현재 건물이 더 높거나 같으면 pop
			else break;
		}
		sum = sum+(sp+1);
		stack[++sp] = tower[i];	//현재 건물 push		
	}
    
    /*
    for(int i=0; i<N; i++){
		for(; (sp>=0) && (H[i] >= stack[sp]); sp-- );
		cnt = cnt + (sp+1);
		stack[++sp] = H[i];
	}
    */
    
	printf("%d\n",sum);
	return 0;
}

 

input

6

4

7

3

4

7

4

 

output

3

반응형

'SW > Algorithm' 카테고리의 다른 글

DP문제, 빵먹기  (0) 2021.07.28
DFS 조합, 모든 경우의 수  (0) 2021.07.27
[BFS] BFS 이해하기 훈련  (0) 2021.07.21
논리문제, 덧칠하기  (0) 2021.07.20
N queen  (0) 2021.02.26