728x90
🤔 문제분석
📝 문제요약
n개의 포트를 연결 할때 겹치지 않는 상태로 연결해야한다.
겹치지 않는 상태로 연결을 하기 위해서는 오른쪽의 포트가 오름차순으로 정렬 되어있어야한다. 따라서 증가하는 가장 긴 부분수열을 찾으면 문제는 해결 된다.
🎯 필요한 개념
- 이분탐색
- 증가하는 가장 긴 부분수열
✅ 알고리즘
- 하나씩 입력받는다.
- 입력받은 데이터에 현재 수열중 가장 작은 인덱스를 찾아낸다.
- 만약 인덱스가 없다면 수열에 추가한다.
- 인덱스가 존재한다면 해당 인덱스의 값을 입력받은 데이터로 치환한다.
- 부분수열의 길이를 출력한다.
💻 코드
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int n;
vector<int> ls;
int bisect(const int v)
{
int start = 0;
int end = ls.size() - 1;
int answer = -1;
while(start <= end)
{
int mid = (start + end) / 2;
if(ls[mid] >= v)
{
answer = mid;
end = mid - 1;
}
else
{
start = mid + 1;
}
}
return answer;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
int temp;
for(int i = 0; i < n; i ++)
{
cin >> temp;
int idx = bisect(temp);
if(idx == -1)
{
ls.push_back(temp);
}
else
{
ls[idx] = temp;
}
}
cout << ls.size();
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1208번 : 부분수열의 합2 (0) | 2024.07.20 |
---|---|
[백준] 1561번 : 놀이공원 (4) | 2024.07.20 |
[백준] 9370번 : 미확인 도착지 (0) | 2024.03.24 |
[백준] 14442번 : 벽 부수고 이동하기 2 (0) | 2024.03.24 |
[백준] 14938번 : 서강 그라운드 (1) | 2024.03.22 |