문제 링크입니다: https://www.acmicpc.net/problem/14646
시간복잡도 O(N)으로 풀 수 있는 탐색 문제였습니다.
알고리즘은 아래와 같습니다.
1. 기존에 선택되지 않았던 칸이라면 벡터에 넣고 선택되었다고 표시합니다.
2. 기존에 선택되었던 칸이라면 지워야하는데 실제로 지우지 않고 지운 원소를 증가시킵니다.
3. 반복문의 끝마다 현재 스티커가 붙여있는 개수를 파악하고 최대 개수를 초기화합니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 100000 + 1;
int N;
vector<int> wheel;
bool selected[MAX];
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0); //cin 실행속도 향상
cin >> N;
int result = 0;
int erase = 0;
for (int i = 0; i < 2 * N; i++)
{
int num;
cin >> num;
//기존에 선택되지 않았다면
if (!selected[num])
{
wheel.push_back(num);
selected[num] = true;
}
//기존에 선택되었다면 지운다
else
erase++;
result = max(result, (int)wheel.size() - erase);
}
cout << result << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 14648번 쿼리 맛보기 (0) | 2018.08.10 |
---|---|
백준 14647번 준오는 조류혐오야!! (0) | 2018.08.10 |
백준 14659번 한조서열정리하고옴ㅋㅋ (0) | 2018.08.09 |
백준 14658번 하늘에서 별똥별이 빗발친다!! (2) | 2018.08.09 |
백준 14657번 준오는 최종인재야!! (0) | 2018.08.09 |