728x90
구현 코드 )
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
#define maxn (int)(le9)+1
int t, n, x, ans, cnt, block;
map<int, int> lastseen;
int main() {
cin >> t; // 테스트 케이스 개수 입력
while (t--) {
cin >> n; // 정수 리스트의 길이 입력
lastseen.clear();
//테스트 케이스가 1개 이상 입력 될 경우 map을 초기화 하여 입력을 받아온다.
ans = 0, cnt = 0, block = 0;
for (int i = 1; i <= n; i++) {
cin >> x;
int lx = lastseen[x];
if (lx != 0) {
block = max(block, lx);
cnt = i - block - 1;
}
cnt++;
lastseen[x] = i;
ans = max(ans, cnt);
}
cout << ans << '\n';
// 끗!
}
}
코드 설명 )
1. 변수 설명
int t : 테스트 케이스 입력 개수 저장
int n : 리스트의 길이 입력 저장
int x : 사용자가 입력한 정수
int ans : 중복 없이 측정 가능한 최대 길이
int cnt : 현재 중복 없이 측정하고 있는 길이
int block : 가장 최근 마주한 중복 element
2. 코드 진행
- 사용자가 입력한 길이 만큼의 반복문을 진행한다.
- x를 가장 최근에 본 위치를 저장하는 map인 lastseen에서 index x의 값을 lx에 저장한다.
=> 본 적이 없을 경우 0의 값을 반환한다. - x를 본 위치가 있을 경우 중복값이 감지된 것 이므로 block 위치를 업데이트 하여 중복 지점을 체크 한다.
- lx와 현재 block 값을 비교하여 큰 값을 저장하는 이유는 앞서 지정해 두었던 block 값 보다 앞의 index로 block을 설정 할 경우 중복이 발생할 수 있기 때문에 더 큰 index 값을 block으로 지정하여 중복을 막는다.
- block index 바로 뒤 index 부터 현재 i의 위치까지의 길이를 cnt에 저장한다.
- 가장 최근에 본 입력값 x의 위치는 현재 i의 위치로 last seen을 업데이트 한다.
- 지금까지 측정 된 중복 없이 연속된 길이 (ans) 와 현재 측정 중인 연속된 길이(cnt)를 비교하여 더 긴 값을 ans에 저장한다.
728x90
'🐣 알고리즘 삐약 > ✏️ 냅다 덤벼보는 문제풀이' 카테고리의 다른 글
[C++] UVa 750 : 8 Queens Chess Problem (0) | 2022.04.20 |
---|---|
[CSES] Road_Construction | C++ (0) | 2022.04.20 |
[codeforces 1092B ] Teams Forming (JAVA | C++) (0) | 2022.04.20 |
[CSES] Road Reparation (0) | 2022.04.19 |
UVa / 00514 Rails [JAVA] (0) | 2022.03.11 |