알고리즘 문제 해결/BOJ

[LIS, 이분 탐색] BOJ 2352 반도체 설계 (C++)

jmkimmessi 2022. 6. 7. 16:02
반응형

https://www.acmicpc.net/problem/2352

 

2352번: 반도체 설계

첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주

www.acmicpc.net

 

문제 해결 알고리즘

 

LIS알고리즘 (최장 증가 부분 수열 알고리즘)을 써준다. 

 

이 때, $O(n \mathrm{log} n)$ 알고리즘을 사용한다 (이분 탐색).

 

https://kimmessi.tistory.com/191?category=871925 

 

[알고리즘] 최장 증가 부분 수열(LIS) - DP, 이분 탐색, LIS 출력

최장 증가 부분 수열 (LIS)이란? 어떤 수열에서 수열의 일부 원소를 골라 만든 부분 수열 중, 각 원소가 이전 원소보다 크다는 조건을 만족하고, 그 길이가 최대인 수열을 최장 증가 부분 수열이라

kimmessi.tistory.com

자세한 내용은 위의 링크를 참고

소스 코드

 

#include <bits/stdc++.h>
#define MAX 1000001
using namespace std;
 
int arr[MAX];
int LIS[MAX];
 
int binary_search(int left, int right, int target){
 
    int mid;
 
    while(left < right){
 
        mid = (left + right) / 2;
 
        if(LIS[mid] < target) left = mid + 1;
        else right = mid;
 
    }
 
    return right;
}
 
int main(){
 
    ios::sync_with_stdio(0);
	cin.tie(0);
 
    int N; cin >> N;
 
    for(int i=0;i<N;i++){
        cin >> arr[i];
    }
 
    int j = 0, i = 1;
    LIS[0] = arr[0];
 
    while(i < N){
 
        if(LIS[j] < arr[i]){
            LIS[j+1] = arr[i];
            j++;
        }
        else {
            int idx = binary_search(0, j, arr[i]);
            LIS[idx] = arr[i];
        }
 
        i++;
    }
 
    cout << j+1 << '\n';
 
 
}
반응형