💗코딩테스트

[codility] RectangleBuilderGreaterArea 문제 파이썬

해서미 2023. 1. 25. 21:48

문제 https://app.codility.com/programmers/trainings/2/rectangle_builder_greater_area/start/

 

Codility

Your browser is not supported Please, update your browser or switch to a different one. Learn more about what browsers are supported

app.codility.com

 

 

from collections import Counter
import itertools

def solution(A, X):
    counterDict = Counter(A)
    answer = 0
    candidateArr = []
    for k, v in counterDict.items():
        if (v>1):
            candidateArr.append(k)

        if (v>3) and k*k>=X:
            answer+=1
            
    combination = list(itertools.combinations(candidateArr,2))
    resultArr = [(x,y) for x, y in combination if x*y>=X]
    answer = answer + len(resultArr)

    if (answer>1000000000):
        return -1

    return answer

무지성으로 풀었더니 시간 초과ㅋㅋㅋ 예상하긴 함

조합을 직접 구해버리면 시간복잡도가 n*n라 다른 방법을 생각해 본다.

X보다 작아지면 더 작은것들은 계산 하지 않도록. 

빅오 엔제곱이 나옴

스코어는 69%

 

완성 코드

from collections import Counter

def solution(A, X):
    counterDict = Counter(A)
    answer = 0
    candidateArr = []
    for k, v in counterDict.items():
        if (v>1):
            candidateArr.append(k)

        if (v>3) and k*k>=X:
            answer+=1

    candidateArr.sort()  
    i = 0
    j = len(candidateArr) - 1
    while i < j:
        if candidateArr[i] * candidateArr[j] >= X:
        	answer += j - i
            if answer > 1000000000: 
                return -1
            j -= 1
        else:
            i += 1
    return answer

완성