codility max counter
https://app.codility.com/demo/results/trainingUBUCBJ-RVE/
def solution(N, A):
res = [0] * N
max_counter = 0
for a in A:
if a <= N: # N카운터 존재
res[a-1] +=1 # 카운터 올림
if max_counter < res[a-1]: # max_counter 보다 크면 현재 카운터를 tmp_max로 변경
max_counter = res[a-1]
else: # max counter 실행
for i in enumerate(res): # 전부 max_counter로 덮어씌운다.
res[i] = max_counter
return res
빅오노테이션이 O(MxN) 인 관계로 이중포문에서 하나를 없애야 한다.
# N 카운터가 있음. 0으로 세팅
# max counter : 모든 카운터들이 아무 카운터의 최대 값으로 세팅됨.
# A[K] = X 이면, K오퍼레이션은 X를 증가시킨다.
# -> 값이 X면 X를 증가시킴 (X범위 1<=X<=N)
# A[K] = N + 1 이면 K는 max counter (??? K가 N보다 크면 max??)
# 아아아 max counter라는 걸 실행함!!!
def solution(N, A):
res = [0] * N
max_counter = 0
tmp_max = 0
for a in A:
if a <= N: # N카운터 존재
if max_counter > res[a-1]: # 1 max_counter가 더 크면 max_counter가 갱신된 것
res[a-1] = max_counter # 2 max_counter 값으로 변경해준다.
res[a-1] +=1 # 3 그리고 그 다음에 카운터 시킨다
if tmp_max < res[a-1]: # 4 tmp_max보다 크면 현재 카운터를 tmp_max로 변경
tmp_max = res[a-1]
else: # max_counter 에 현재 tmp_max를 넣는다. (max_counter는 그때그때 실행할 것이다.)
max_counter = tmp_max
# 아직 max_counter가 변경 된 이후에 counter가 변경된 이력이 없으면 max_counter로 덮어씌워준다.
# 물론 max_counter보다 작은 경우.
for idx, _ in enumerate(res):
if (res[idx] < max_counter):
res[idx] = max_counter
return res
a = [3,4,4,6,1,4,4]
N = 5
print(solution(5, a))
댓글 없음:
댓글 쓰기