문제 링크입니다: https://www.acmicpc.net/problem/2352
http://jaimemin.tistory.com/430와 유사한 문제로 LIS 문제였습니다.
하지만 기존의 문제는 O(n^2) 안에 풀어도 되는 문제였지만 이번 문제는 O(nlogn) 안에 풀어야하는 문제였습니다.
O(nlogn) 안에 푸는 문제는 lower_bound 함수를 이용해야 하는데 http://dyngina.tistory.com/16를 참고했습니다.
포스팅을 참고하면 인덱스 배열을 통해 푸는 방법도 있지만 아직 인덱스 배열을 접해본 적이 없으므로 다음 기회에 인덱스 배열을 사용해보도록 하겠습니다.
#include <iostream>
#include <algorithm>
#include <cstring> //memset
using namespace std;
const int MAX = 40000;
int N;
int connect[MAX + 1];
int cache[MAX + 1];
//O(n^2)는 시간초과
/*
int portLIS(int leftPort)
{
int &result = cache[leftPort + 1];
if (result != -1)
return result;
result = 0;
for (int next = leftPort + 1; next < N; next++)
//왼쪽 포트번호가 1이거나 다음 연결할 포트번호가 더 커 꼬이지 않을 경우
if (leftPort == -1 || connect[leftPort] < connect[next])
{
int candidate = 1 + portLIS(next);
result = max(result, candidate);
}
return result;
}
int main(void)
{
cin >> N;
for (int i = 0; i < N; i++)
cin >> connect[i];
memset(cache, -1, sizeof(cache));
//원래대로라면 idx=1부터 입력받으므로 0부터 시작해야하지만
//connect 배열을 idx=0부터 입력받았으므로 -1에서 시작
cout << portLIS(-1) << endl;
return 0;
}
*/
//O(nlogn) 안에 실행되어야함
int portLIS(void)
{
//초기 값
cache[1] = connect[1];
int length = 1;
for (int i = 2; i <= N; i++)
{
if (cache[length] < connect[i]) //선이 안 꼬일 경우 추가하고 continue
{
cache[++length] = connect[i];
continue;
}
//i번째 왼쪽 포트에 연결되어있는 오른쪽 포트의 번호보다 작지 않은 최초의 위치 탐지
int idx = lower_bound(cache + 1, cache + length + 1, connect[i]) - cache;
cache[idx] = connect[i];
}
return length;
}
int main(void)
{
cin >> N;
for (int i = 1; i <= N; i++)
cin >> connect[i];
cout << portLIS() << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2839번 설탕 배달 (0) | 2018.03.31 |
---|---|
백준 1110번 더하기 사이클 (0) | 2018.03.31 |
백준 5582번 공통 부분 문자열 (1) | 2018.03.25 |
백준 11049번 행렬 곱셈 순서 (0) | 2018.03.20 |
백준 2169번 로봇 조종하기 (0) | 2018.03.19 |