[Codility] 4. MaxCounters

Donghee Lee·2022년 3월 23일
0

Algorithm

목록 보기
9/17
post-thumbnail

[Codility] 4. MaxCounters


문제 링크

MaxCounters

문제 요약

주어지는 배열 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
}


Swift 길이가 있는 Array 선언 방법

var arr = [Int](repeating: 0, count: N)  // 0,0,0,0,0
profile
Better than Yesterday

0개의 댓글