알고리즘
코딜리티 Time Complexity - TapeEquilibrium (파이썬)
인공지능 대학생
2022. 4. 28. 12:11
Time Complexity - TapeEquilibrium
* 프로그래밍 주안점
1. 가독성
2. 성능
문제링크: https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/
설명 (요약)
A 리스트 내 왼쪽데이터, 오른쪽데이터의 각각 합을 뺀 절대값이 가장 작은 경우를 찾아라 예: A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3 P = 1, difference = |3 − 10| = 7 P = 2, difference = |4 − 9| = 5 P = 3, difference = |6 − 7| = 1 P = 4, difference = |10 − 3| = 7 결과: 1 |
풀이전략
- 입력받는 데이터를 두부분으로 나눈다. 왼쪽부터 더하는 부분 + 오른쪽부터 더하는 부분. 각각 A, B 라고 생각한다.
- |A의합 - B의합| 으로 계산을 수행한다.
- 루프를 돌며 최소값이 가장 작은 부분을 찾는다.
고려사항
- 2개의 항만 존재하는 경우의 처리
- 항상 왼쪽항과 오른쪽 항을 다 더해서 할 경우 O(NxN) 이 되어 타임아웃이 된다.
- 리스트 내 모든 항에 음수가 없다면 최소값이 커질때 중지하면 되지만, 항 중 음수가 있다면 루프를 다 돌아야 한다.
코드
INF = int(1e9) # 큰값을 나타내기 위함
def solution(A):
sum1 = 0 # 왼쪽부터 더하는 리스트의합
sum2 = sum(A) # 오른쪽부터 더하는 리스트의합
min_v = INF
for i in range(1, len(A)): # 항목중 음수가 있을수 있기에 모든 항목을 다 조회한다.
sum1 += A[i-1]
sum2 -= A[i-1]
t_v = abs(sum1 - sum2)
if min_v > t_v: # 계산식이 가장 작은 값을 찾는다.
min_v = t_v
return min_v
solution([3,1,2,4,3]) # return 1
#solution([3,1]) # return 2
Github: https://github.com/oksk1111/algorithm_python/blob/main/codility_TimeComplexity_TapeEquilibrium.ipynb
GitHub - oksk1111/algorithm_python
Contribute to oksk1111/algorithm_python development by creating an account on GitHub.
github.com
결과
Analysis
Detected time complexity: O(N)
반응형