Given an array of integers, sum consecutive even numbers and consecutive odd numbers. Repeat the process while it can be done and return the length of the final array.
요약
짝수나 홀수가 연속으로 구성 되어있는 경우 해당 연속된 짝수 혹은 홀수의 합을 구하여 재정렬하라. 재정렬 후에도 연속된 짝수나 홀수가 존재하는 경우 똑같은 과정을 거쳐 연속된 짝수 혹은 홀수가 없을 때 까지 재정렬하고 완성된 배열의 길이(length)를 return 해라
None
[2, 1, 2, 2, 6, 5, 0, 2, 0, 5, 5, 7, 7, 4, 3, 3, 9]
[2, 1, 10(2+2+6), 5, 2(0+2+0), 24(5+5+7+7), 4, 15(3+3+9)] #1회 정렬
[2, 1, 10, 5, 30(2+24+4), 15] #2회 정렬(더이상 연속된 짝수나 홀수 없음)
return 6
is_even = lambda x : x % 2 == 0
def sum_groups(arr):
pointer = [arr[0]]
result = []
for v in arr[1:]:
if is_even(pointer[-1]) == is_even(v):
pointer.append(v)
elif is_even(pointer[-1]) != is_even(v):
result.append(sum(pointer))
pointer = [v]
result.append(sum(pointer))
return len(result) if result == arr else sum_groups(result)
from itertools import groupby
def sum_groups(arr):
newarr = [sum(j) for i,j in groupby(arr, key = lambda x: x % 2 == 0)]
return len(newarr) if newarr == arr else sum_groups(newarr)
제 풀이에서 1 ~ 5번까지의 과정을 itertools의 groupby함수 + 리스트컴프리헨션을 통해 구현했습니다. itertools의 경우 combination등 다양한 내장함수를 지원하는데 이 기회에 배워두는것도 좋은 알고리즘 풀이법을 작성하는데 도움이 될 것 같네요.