Algorithm/코딜리티

(코딜리티) Lesson 8. [Leader] : EquiLeader - python

casim 2021. 1. 28. 18:47

문제 : app.codility.com/programmers/lessons/8-leader/equi_leader/

 

EquiLeader coding task - Learn to Code - Codility

Find the index S such that the leaders of the sequences A[0], A[1], ..., A[S] and A[S + 1], A[S + 2], ..., A[N - 1] are the same.

app.codility.com

문제 내용

비어 있지 않은 N개의 배열 A가 주어질 때, S는 0 <= S < N-1라고 할 때, A[0], A[1], ... , A[S] and A[S+1], A[S+2], ... , A[N-1]인 두 배열에서 동등한 지배자인 경우의 수를 return하시오.

 

예를 들어, A = [4, 3, 4, 4, 4, 2] 인 경우,

S = 0일 때, [4] 와 [3, 4, 4, 4, 2]는 둘 다 4를 지배자로 가진다.

S = 2일 때, [4, 3, 4] 와 [4, 4, 2]는 둘 다 4를 지배자로 가진다.

 

따라서, 경우의 수는 2개이므로, 2를 return한다.

제한 사항

  • N은 1~100,000
  • A의 각요소는 -1,000,000,000~1,000,000,000

코드

def solution(A):

    count = 0

    right_dict = {}
    right_len = len(A)
    for a in A:
        if a in right_dict:
            right_dict[a] += 1
        else:
            right_dict[a] = 1
    
    left_leader = 0
    left_leader_count = 0
    left_dict = {}
    left_len = 0

    for a in A:
 
        right_dict[a] -= 1
        right_len -= 1

        if a in left_dict:
            left_dict[a] += 1
        else:
            left_dict[a] = 1
        left_len += 1
        
        if left_dict[a] > left_leader_count:
            left_leader = a
            left_leader_count = left_dict[a]
        
        if left_leader_count > left_len/2 and right_dict[left_leader] > right_len/2:
            count += 1

    return count

해설

제일 처음 처음 전체 값을 오른 쪽 dictionary에 넣어 빈도 수를 만든 후,

for문을 하나씩 돌면서 오른쪽 dictionary는 빼고, 왼쪽 dictionary에 추가합니다.

추가하면서, 좌측에서 제일 큰 값을 우측에서도 도출해 내고, 둘다 전체 중에 반을 넘는 지 확인하면, count를 하나씩 늘립니다.