July 16, 2023
처음에는 0으로 설정된 N개의 카운터가 주어지며, 이 카운터에는 두 가지 가능한 연산이 있습니다:
비어 있지 않은 M개의 정수로 구성된 배열 A가 주어집니다. 이 배열은 연속 연산을 나타냅니다:
예를 들어 정수 N = 5와 배열 A가 있다고 가정해 보겠습니다:
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4는 각 연속 연산 후 카운터의 값이 됩니다:
(0, 0, 1, 0, 0)
(0, 0, 1, 1, 0)
(0, 0, 1, 2, 0)
(2, 2, 2, 2, 2)
(3, 2, 2, 2, 2)
(3, 2, 2, 3, 2)
(3, 2, 2, 4, 2)목표는 모든 연산 후 모든 카운터의 값을 계산하는 것입니다.
함수를 작성합니다:
function solution(N, A);정수 N과 M개의 정수로 구성된 비어 있지 않은 배열 A가 주어지면 카운터의 값을 나타내는 정수 시퀀스를 반환하는 함수입니다.
결과 배열은 정수의 배열로 반환되어야 합니다.
예를 들어, 주어진
A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4함수는 위에서 설명한 대로 [3, 2, 2, 4, 2]를 반환해야 합니다.
다음 가정에 대한 효율적인 알고리즘을 작성합니다:
최대 카운터(maxCount)를 설정하는 방법을 모든 배열을 최대카운터를 한번에 설정(모든 배열을 순회하면서 설정)하게되면 성능측면에서 떨어지므로 다음 카운트를 증가할때 해당 인덱스만 최대카운터로 설정
최대카운터가 아닐 경우엔
function solution(N, A) {
let maxCount = 0
let max = 0
const result = new Array(N).fill(0)
for (let i = 0; i < A.length; i++) {
const index = A[i] - 1
if (A[i] >= N + 1) {
maxCount = max
} else {
if (maxCount > result[index]) {
result[index] = maxCount
}
result[index]++
if (result[index] > max) {
max = result[index]
}
}
}
return result.map(value => {
return value < maxCount ? maxCount : value
})
}