주어지는 배열 A의 값에 따라 해당 원소의 값을 1을 증가시키는 increase(X) 연산을 수행하거나, 해당 원소의 값이 주어지는 N+1과 같을 때 모든 원소를 Max 값으로 바꾸는 max counter 연산을 수행.
배열의 모든 원소 값을 순회하며 수행한 결과 최종 배열을 반환.
N and M are integers within the range [1..100,000]
each element of array A is an integer within the range [1..N + 1].
for loop에서는 MaxValue 값으로 counterArr을 갱신하지 않는다.
maxValue만 순회할 때 갱신한다. 단, N+1이 되었다면 flag 값도 바꾸고, 해당 원소가 다시 A의 element로 지정되었다면 해당 원소에 포함된 배열을 직접 수정한다.
최대값이 바뀌었는데도 불구하고 갱신되지 않은 원소는 map으로 처리하여 flag와 비교한다.
import Foundation
import Glibc
public func solution(_ N : Int, _ A : inout [Int]) -> [Int] {
var counterArr = [Int](repeating: 0, count: N) // 0,0,0,0,0
var maxValue: Int = 0
var flagMaxValue: Int = 0
for element in A {
let counterIdx = element - 1
if(element < N + 1) {
//최대값이 갱신되었을 때(아직 CounterArr 배열에는 미반영)
if(counterArr[counterIdx] <= flagMaxValue) {
counterArr[counterIdx] = flagMaxValue + 1
} else {
counterArr[counterIdx] += 1
}
if(counterArr[counterIdx] > maxValue) {
maxValue = counterArr[counterIdx]
}
}
else { //element == N+1, 기준값 대입
flagMaxValue = maxValue
}
}
//CounterArr 반영
counterArr = counterArr.map {
if $0 < flagMaxValue {
return flagMaxValue
} else {
return $0
}
}
return counterArr
}
var arr = [Int](repeating: 0, count: N) // 0,0,0,0,0