반응형
리뷰
https://www.acmicpc.net/problem/13144
투 포인터로 포인터를 옮겨가며 방문처리를 하고 두 포인터 위치의 차이를 더해주는 문제
최악의 케이스의 경우 int의 범위를 넘어가므로 long long타입으로 ans를 지정해 주어야 한다.
전역 변수
- n : 수열의 길이를 저장할 변수
- nodes : 수열 정보를 저장할 변수
- v : 각 수를 방문처리할 변수, 최대 10만이 들어오므로 그거보다 크게 세팅해 준다.
함수
없음
문제풀이
- n값을 입력 받고, n개의 수를 nodes배열에 입력받아 준다.
- 두 포인터 l, r을 0으로 초기화 해주고, 정답 변수 ans를 0으로 초기화 해준다.
- r이 n범위 내에 있을때 동안 반복문을 실행해 준다.
- 만약 현재 r포인터가 있는 수가 방문하지 않았다면 ans에 r - l + 1을 더해주고, 방문처리 후 r을 다음위치로 이동한다.
- 만약 방문한 수라면 방문이 해제될때까지 l을 증가시키며 옮기면서 방문을 해제해준다.
- 탐색을 마친 후 ans에 저장되어있는 값을 출력해 준다.
참고 사항
ans는 long long타입이어야 한다.
정답 코드
#include<iostream>
using namespace std;
int n;
int nodes[100000];
int v[100001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) cin >> nodes[i];
int l = 0, r = 0;
long long ans = 0;
while (r < n) {
if (!v[nodes[r]]) {
ans += r - l + 1;
v[nodes[r++]]++;
}
else {
while (v[nodes[r]]) v[nodes[l++]]--;
}
}
cout << ans;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[S4] 백준 2960번 에라토스테네스의 체 C++ 소수 판정, 에라토스테네스의 체 (0) | 2024.11.01 |
---|---|
[G4] 백준 9935번 문자열 폭발 C++ 문자열, 스택 (0) | 2024.10.31 |
[G4] 백준 2179번 비슷한 단어 C++ 문자열, 브루트포스 알고리즘 (0) | 2024.10.31 |
[G3] 백준 22866번 탑 보기 C++ 스택 (0) | 2024.10.31 |
[G3] 백준 14658번 하늘에서 별똥별이 빗발친다 C++ set, 브루트포스 알고리즘 (0) | 2024.10.31 |