공부/알고리즘
[python] Codility Lesson 6-4. NumberOfDiscIntersections
richpark
2021. 8. 16. 13:44
1. Sorting section에 위치한 문제라 sort를 해야 시간복잡도에서 무사히 통과하리라 생각했지만 쉽게 방법이 떠오르지 않아 손 내키는데로 작성해 보았다.
원의 중심은 list에서 순차적으로 증가하니, 2중 for문을 돌면서 first_비교원의 최대값이 second_비교원의 최소값보다 크거나 같은경우 answer_count += 1
정확도는 100%를 달성했지만 performance에서 망가진 O(N*2) 코딜리티는 N*2을 가만두지 않는다 ㅠㅠ
def solution(A):
answer_count = 0
for i in range(len(A)-1):
for j in range(i+1, len(A)):
if i+A[i] >= j-A[j]:
answer_count +=1
if answer_count > 10000000:
answer_count = -1
return answer_count
2. 깔끔한 정답을 찾아 보았다.
정말 대단하다, 어떻게 이런 생각을 할 수 있을까 같은 사람이 ㅠㅠ
1. 가장 최소범위를 지나는 원을 시작으로 포함되는 원을 만날때 마다 r += 1, 그리고 t += 1
2. for 문을 돌면서 d[1] == 1, 즉 원이 하나 완성된 것을 만나면 t -= 1
def solution(A):
disc = []
for i, v in enumerate(A):
disc.append((i-v, -1))
disc.append((i+v, 1))
disc = sorted(disc)
t = 0
r = 0
for d in disc:
if d[1] == 1:
t -= 1
else :
r += t
t += 1
return r if r <= 10000000 else -1
728x90