[Codility] 4. MaxCounters


[Codility] 4. MaxCounters


質問リンク


MaxCounters

問題の概要


与えられた配列Aの値に基づいて、その要素の値を1だけ大きくするプラス記号(X)演算、または、その要素の値が与えられたN+1に等しいときに、すべての要素をMax値に変換する最大カウンタ演算が実行される.
アレイ内のすべての要素値を巡回し、最終アレイを返します.

要求


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を使用して反ARRを更新しません.
maxValueのみが巡回時に更新されます.ただし、N+1の場合はflag値が変更され、その要素が再びAの要素として指定された場合は、その要素に含まれる配列が直接変更されます.
最大値は変更されますが、更新されていない要素は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
}

SWIFT長のアレイ宣言方法

var arr = [Int](repeating: 0, count: N)  // 0,0,0,0,0