An integer M and a non-empty array A consisting of N non-negative integers are given. All integers in array A are less than or equal to M.
A pair of integers (P, Q), such that 0 ≤ P ≤ Q < N, is called a slice of array A. The slice consists of the elements A[P], A[P + 1], ..., A[Q]. A distinct slice is a slice consisting of only unique numbers. That is, no individual number occurs more than once in the slice.
For example, consider integer M = 6 and array A such that:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2There are exactly nine distinct slices: (0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2), (3, 3), (3, 4) and (4, 4).
The goal is to calculate the number of distinct slices.
Write a function:
function solution(M, A);
that, given an integer M and a non-empty array A consisting of N integers, returns the number of distinct slices.
If the number of distinct slices is greater than 1,000,000,000, the function should return 1,000,000,000.
For example, given integer M = 6 and array A such that:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2the function should return 9, as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..100,000];
- M is an integer within the range [0..100,000];
- each element of array A is an integer within the range [0..M].
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
//
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
for(let )
}
function solution(M, A) {
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1);
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1);
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1);
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); //
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3], [3,4],
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / []
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] /
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / []
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / [5,2], [2]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / [][5,2], [2]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / [5]/ [5,2], [2]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / [5]/ [5,2], [2]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
// you can write to stdout for debugging purposes, e.g.
// console.log('this is a debug message');
function solution(M, A) {
// Implement your solution here
// 정수 M, 배열 A ( 0, 양수 구성 , 모두 M보다 작거나 같다)
// A의 슬라이스 = (P,Q) 쌍 ( 0 <= P <= Q < N, 인덱스 ) 정의
// => A[P], ... ,A[Q]
// A의 구별 슬라이스 : 유니크 숫자로 구성
// n번 투 포인터를 돌린다.
let totalSlices = 0;
let front = 0;
let back = 0;
const limit = 1000000000; // 문제에서 제시한 최대 반환값
const N = A.length;
// 각 숫자가 현재 슬라이스에 존재하는지 확인하기 위한 배열
// M은 최대 100,000이므로 배열로 관리하는 것이 Map보다 빠릅니다.
const seen = new Array(M + 1).fill(false);
while (front < N) {
if (seen[A[front]] === false) {
// 1. front에 있는 숫자가 현재 슬라이스에 없는 경우 (중복 아님)
seen[A[front]] = true; // 방문 체크
// back에서 front까지의 모든 부분 배열이 유효하므로 개수를 더함
// 예: [3, 4]가 유효하다면, 새로 추가된 4로 인해 [4], [3, 4] 2개가 추가됨
totalSlices += (front - back + 1); // [3] / [3,4], [4] / [3,4,5], [4,5], [5] / [5]/ [5,2], [2]
// 10억 개를 초과하면 즉시 반환
if (totalSlices >= limit) {
return limit;
}
front++; // 앞쪽 포인터 전진
} else {
// 2. front에 있는 숫자가 이미 존재하는 경우 (중복 발생)
// 중복된 숫자가 사라질 때까지 back 포인터를 이동시키며 방문 해제
seen[A[back]] = false;
back++;
}
}
return totalSlices;
}
The solution obtained perfect score.