티스토리 뷰
문제
별 잡다한 얘기를 다 붙여놨는데, 주어지는 integer sequence중에서 중복 원소를 포함하지 않는 longest subsequence의 최대 길이를 구하라는 문제다. (nlgn)안에 풀 수 있는 문제다. max_length를 갱신해가는 logic으로 풀었는데 일단 코드는 다음과 같다.
#include<iostream>
#include<map>
using namespace std;
/*Given a sequence of integers, find the length of the longest contiguous
subsequence containing no repeated elements.
*/
int main() {
int N;
cin >> N;
while (N--) {
int test,max_length=0,length=0,startidx=1; //start idx: start point of subsequence
int* input_arr;
map<int, int> snow_flakes; //first int is size of flake
cin >> test;
input_arr = new int[test+1]; //cause map[doesn't exist] returns 0, can't use 0 index.
for (int i = 1; i <= test; i++) cin >> input_arr[i]; //input part
for (int i = 1; i <= test; i++) {
if (snow_flakes[input_arr[i]] == 0) { //if it is not contained in subsequence
snow_flakes[input_arr[i]] = i; //write the position
++length; //subsequnce's length++
if (length > max_length) max_length = length; //renew max length
}
else { //if it is contained in subsequence
for(int j = snow_flakes[input_arr[i]]-1; j >= startidx; j--) { //remove at sequence from where it appear to start of sequence
snow_flakes[input_arr[j]] = 0;
--length;
}
startidx = snow_flakes[input_arr[i]] + 1; //start at final point of removal
snow_flakes[input_arr[i]] = i; //now it appears at here
}
}
cout << max_length <<endl;
}
return 0;
}
핵심은 다음 파트이다.
for (int i = 1; i <= test; i++) {
if (snow_flakes[input_arr[i]] == 0) { //if it is not contained in subsequence
snow_flakes[input_arr[i]] = i; //write the position
++length; //subsequnce's length++
if (length > max_length) max_length = length; //renew max length
}
else { //if it is contained in subsequence
for(int j = snow_flakes[input_arr[i]]-1; j >= startidx; j--) { //remove at sequence from where it appear to start of sequence
snow_flakes[input_arr[j]] = 0;
--length;
}
startidx = snow_flakes[input_arr[i]] + 1; //start at final point of removal
snow_flakes[input_arr[i]] = i; //now it appears at here
}
}
이 부분의 기본 logic은 아래 그림과 같다.
일단 i번째 input을 보면 다음을 생각한다.
지금 subsequence에 포함하고 있는 input인가?
->NO: 지금 subsequence에 포함하고 length++, maxlength갱신
->YES: 그 input이 옛날에 나온 시점부터 현재 subsequence의 시작원소까지를 전부 지우고 지운 만큼 length를 조정&그 원소가 나온 위치를 map에서 바꿔준다.
이 때 해당 input이 나온 위치를 저장하는 데에 자료구조 map을 이용하였다. map에는 input이 없는 경우 0을 반환하게 되어있으니까 (원소를 지우는 것)==(해당 map의 그 원소에 해당하는 Data에 0 대입) 이 된다.
'기초 알고리즘 문제 풀이' 카테고리의 다른 글
24. Uva-11136 Hoax or what //overflow (0) | 2020.02.23 |
---|---|
23. UVa-978 Lemmings Battle! //multiset (0) | 2020.02.23 |
21. Uva-11286 Conformity (0) | 2020.02.22 |
20. UVa-1062 (0) | 2020.02.22 |
19. UVa-11988 Broken Keyboard // Unique linked list problem (0) | 2020.02.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 머신 러닝
- gradient descent
- 인덱스 이미지
- 이미지처리
- 신호 및 시스템
- 영상구조
- ML
- Andrew ng
- 밑바닥부터 시작하는 딥러닝
- CNN
- 신경망
- 영상처리
- 머신러닝
- 이미지
- 자연어 처리
- 매트랩 함수
- 컴퓨터과학
- 매트랩
- Neural Network
- 이산 신호
- 딥러닝
- NLP
- 순환 신경망
- rnn
- 연속 신호
- Logistic Regression
- 사진구조
- CS
- 컴퓨터 과학
- RGB이미지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함