투 포인터를 사용해 풀었다. left와 right이라는 이름의 포인터에서 right을 늘려가면서 visited
를 true
로 바꿔주고, 해당 visited
가 true
라면 중복되는 수가 있는 것이므로 left를 늘려주면서 visited[리스트[left]]
를 false
로 바꿔주는 것을 visited[리스트[right]]
가 false
가 될 때까지 반복한다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = fs.readFileSync(filePath).toString().trim().split("\n");
const n = Number(input[0]);
const l1 = input[1].split(" ").map(Number);
let left = 0;
let right = 0;
let visited = new Array(n + 1).fill(0);
let answer = 0;
while (left <= right) {
if (right >= n) {
break;
}
while (visited[l1[right]]) {
visited[l1[left]] = 0;
left++;
}
answer += right - left + 1;
visited[l1[right]] = 1;
right++;
}
console.log(answer);