본문 바로가기
백준

백준 2352번 반도체 설계 (c++)

by 딴짓거리 2025. 2. 26.

 

꼬임이 없다는 것은 오름차순으로 정렬되어야 한다는것

즉 가장 긴 증가하는 부분수열을 구하는 문제이다

하지만 n이 40000이나 되기 때문에 일일이 비교하면 시간초과가 되므로 이분탐색 기반 알고리즘을 이용한다

 

cin >> n;
for (int i = 1; i <= n; i++)
{
	int a;
	cin >> a;
	if(arr.empty()) arr.push_back(a);
	else
	{
		int idx = lower_bound(arr.begin(), arr.end(), a) - arr.begin();
		if (idx >= arr.size()) arr.push_back(a);
		else arr[idx] = a;
	}
}

 

숫자를 받으면서 바로 증가하는 수열을 만들어준다

lower_bound는 배열에서 지정한 수보다 크거나 같은 숫자가 몇번째 인덱스에서 처음 나오는지 반환한다

iter로 반환하므로 .begin()을 빼주면 다음 인덱스를 구할 수 있다

지정한 수가 가장 큰 수면 end() 를 반환할테니 그럴 경우 push_back으로 넣어주고

아니면 그 인덱스의 수를 교체한다

cout << arr.size() << endl;

만들어진 수열의 길이를 출력하면 끝

 

가장 긴 증가하는 부분수열을 lower_bound를 통해 구하는 문제이다

생긴것만 다르고 풀이는 다른 이런 문제가 몇개 있어서, 문제의 본질을 얼마나 빨리 파악하느냐가 중요하다

'백준' 카테고리의 다른 글

백준 1504 특정한 최단 경로 (c++)  (0) 2025.03.17
백준 1584 게임 (c++)  (0) 2025.03.14
백준 14786번 Ax+Bsin(x)=C (c++)  (0) 2025.02.25
백준 2230번 수 고르기 (c++)  (0) 2025.02.22
백준 14583번 이음줄 (c++)  (0) 2025.02.20