Cute Blue Flying Butterfly
본문 바로가기
알고리즘/Softeer

[C++] Softeer Lv.3 징검다리

by jordancancode 2024. 10. 25.

출처

https://softeer.ai/practice/6293

 

 

 

문제

언어별 시간/메모리

 

언어 시간 메모리
JavaScript 2초 256MB
C 1초 256MB
C++ 1초 256MB
Java 2초 256MB
Python 2초 256MB

남북으로 흐르는 개울에 동서로 징검다리가 놓여져 있다.

 

이 징검다리의 돌은 들쑥날쑥하여 높이가 모두 다르다. 철수는 개울의 서쪽에서 동쪽으로 높이가 점점 높은 돌을 밟으면서 개울을 지나가려고 한다.

 

돌의 높이가 서쪽의 돌부터 동쪽방향으로 주어졌을 때 철수가 밟을 수 있는 돌의 최대 개수는?

 
제약조건

1 ≤ N ≤ 3×103 인 정수

1 ≤ Ai ≤ 108 인 정수

 

 

 

입력

첫 번째 줄에 돌의 개수 N이 주어진다.

두 번째 줄에 돌의 높이 Ai (1 ≤ i ≤ N)가 서쪽부터 동쪽으로 차례로 주어진다.

 

 

 

출력

첫 번째 줄에 철수가 밟을 수 있는 돌의 최대 개수를 출력하라.

 

 

 

풀이

#include <bits/stdc++.h>
using namespace std;

int main() {
	int N;
	scanf("%d", &N);
	vector<int> bridge(N);
	vector<int> cnt(N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &bridge[i]);
	}
	for (int i = 0; i < N; i++){
		for (int j = 0; j < i; j++) {
			if (bridge[j] < bridge[i]){
				cnt[i] = max(cnt[i], cnt[j] + 1);
			}
			
		}
	}
	printf("%d", *max_element(cnt.begin(), cnt.end())+1);

	return 0;
}

DP문제, 시간복잡도 O(N^2)로 풀 수 있다!

반응형