PS/Softeer

[Softeer 🌟🌟🌟] 징검다리(C++)

박땅콩 2022. 8. 20.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

[문제 설명]

 

 

남북으로 흐르는 개울에 동서로 징검다리가 놓여져 있다.
이 징검다리의 돌은 들쑥날쑥하여 높이가 모두 다르다. 철수는 개울의 서쪽에서 동쪽으로 높이가 점점 높은 돌을 밟으면서 개울을 지나가려고 한다.
돌의 높이가 서쪽의 돌부터 동쪽방향으로 주어졌을 때 철수가 밟을 수 있는 돌의 최대 개수는?

 

 

[제약 조건]

 

 

1 ≤ N ≤ 3×103 인 정수

1 ≤ Ai ≤ 108 인 정수

 

 

[입력형식]

 

 

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

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

 

 

[출력 형식]

 

 

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

 

 

[입출력 예제]

 

 

입력 출력
5
3 2 1 4 5
3

 

 

[문제 풀이]

 

 

최장 증가 부분 수열 문제이다.

O(nlogn) 방식을 사용하여 풀었다.

 

 

[Algorithm] 최장 증가 부분 수열(LIS)

DP 문제인 LIS 문제를 풀기 위해 LIS 알고리즘을 공부했습니다. 제가 공부한 내용을 바탕으로 작성했습니다. 잘못된 부분이 있을 수 있습니다. 잘못된 부분이 있다면 지적부탁드립니다! 최장 증가

park-peanut.tistory.com

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/Softeer: Softeer HYUNDAI

Softeer HYUNDAI. Contribute to SmallPeanutPark/Softeer development by creating an account on GitHub.

github.com

 

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> LIS;

int main(int argc, char** argv)
{
	int stonecount; cin >> stonecount;
	for(int i = 0; i < stonecount; ++i) {
		int n; cin >> n;
		if(LIS.empty()) {
			LIS.emplace_back(n);
		} else {
			if(LIS.back() < n) {
				LIS.emplace_back(n);
			} else {
				auto location = lower_bound(LIS.begin(), LIS.end(), n);
				*location = n;
			}
		}
	}
	cout << LIS.size();
	return 0;
}

 

 

728x90

'PS > Softeer' 카테고리의 다른 글

[Softeer 🌟🌟🌟] GINI야 도와줘(C++)  (0) 2022.08.20
[Softeer 🌟🌟] 장애물 인식 프로그램(C++)  (0) 2022.08.20

댓글