Haribo ML, AI, MATH, Algorithm

스타 수열


from collections import Counter
def solution(a):
    elements = Counter(a).most_common()
    answer = 0
    for k, v in elements:
        if v <= answer : break
        star = 0
        idx = 0
        while idx < len(a)-1:
            if k not in a[idx:idx+2] or (a[idx] == a[idx+1]):
                idx += 1
                continue
            star += 1
            idx += 2
        answer = max(star, answer)
    return answer * 2

스타수열

  • x의 길이를 2n이라 할 때, 다음과 같은 n개의 집합 {x[0], x[1]}, {x[2], x[3]}, ..., {x[2n-2], x[2n-1]} 의 교집합의 원소의 개수가 1 이상입니다.
  • x[0] != x[1], x[2] != x[3], ..., x[2n-2] != x[2n-1] 입니다.

스타수열의 교집합의 원소는 1개 이상이기 때문에, a 원소중 하나를 뽑아 그 숫자를 기준으로 스타수열들을 만들어나가면 된다는 사실을 파악할 수 있다.

스타수열의 공통원소를 k라고 할 때, a에서 2개의 연속된 원소가 k-스타수열이 되지않는 경우는 바로

  • k not in a[i:i+2]

  • a[i] == a[i+1]

이 두가지 경우를 제외한 나머지경우는 k-스타수열이 된다.

a의 원소들을 빈도순 기준으로 정렬

idx 0 ~ len(a)-1 까지 a[idx], a[idx+1]k스타수열인지 확인

  • 스타수열이라면 2칸 옮겨서 검사
  • 스타수열이 아니라면 한칸옯겨서 검사

from collections import Counter
def solution(a):
    elements = Counter(a).most_common() # 원소갯수 많은 순으로 정렬
    answer = 0
    for k, v in elements:
        if v <= answer: break # 원소갯수가 answer보다 같거나 작으면 검사할 필요없음
        star = 0 #스타수열 갯수
        idx = 0
        while idx < len(a)-1:
            if k not in a[idx:idx+2] or (a[idx] == a[idx+1]): # k-스타수열이 아닌지 검사
                idx += 1
                continue
            star += 1
            idx += 2
        answer = max(star, answer)
    return answer * 2

Similar Posts

이전 포스트 야근 지수

다음 포스트 줄 서는 방법

Comments