2022. 4. 10. 21:23ㆍ알고리즘(Python)/백준
from sys import stdin
n = int(input())
concentList = []
for i in range(n):
concentList.append(int(stdin.readline().rstrip()));
print(sum(concentList) - (n-1))
34908 kb | 284 ms |
개선된 코드 (메모리 16%증가, 처리속도 50%감소)
from sys import stdin
n = int(input())
concentList = list(map(int,stdin.read().split()))
print(sum(concentList) - (n-1))
40468 kb | 132 ms |
추측할 수 있는 내용
1. for문이나 append를 했을 때 처리하는 속도가 늘어난다.
2. map()와 list()를 썼을 때 메모리를 더 사용한다. 아마 deep copy처럼 복사해서 저장을 하는 과정이 있을 수 있다.
멀티탭의 갯수는 (1 ≤ N ≤ 500,000). 리스트의 append() 시간복잡도는 O(1)인데 50만 정도의 데이터가 있다고 해서 2배 가까이 시간 차이가 날까?
아마도 메모리가 아래 쪽이 더 차지하는 이유는 map과 list함수 때문이 아닐까 생각해 본다. 그렇게 생각한 이유는 map의 원리가 함수를 각 요소에 적용시켜주는 함수인데 아래의 실험을 보면


이처럼 map함수를 적용시켰을 때 원래 리스트의 값이 달라지지 않는 것을 알 수 있다.
이는 곧, 메모리를 더 사용해서 복사를 했다는 의미로 이해할 수 있다.


마찬가지로 list()로 변환을 했을 때 원래 set의 값은 변하지 않고 잘 유지되고 있다. 이 또한, 복사를 해서 반환했다는 것을 알 수 있다.
이와 같은 결과를 보아 메모리를 더 사용하게 되는 것은 이해할 수 있다.
하지만 1번의 가정은 map함수와 list함수가 어떻게 내부적으로 돌아가는지 몰라서 현재로서는 검증하기가 어려우므로 검증은 뒤로 미루고 지금은 stdin.Read( )로 한 번에 읽어서 list()를 하는게 for문을 돌려서 append하는 것보다 빠르다라는 것만 기억하고 사용해도 지장은 없을 것 같다.
'알고리즘(Python) > 백준' 카테고리의 다른 글
[3986] 좋은단어 (C#) (0) | 2022.09.13 |
---|---|
[백준] 1931. 회의실 배정 (0) | 2022.04.22 |
[백준] 3036. 링 (0) | 2022.04.18 |
[백준] 2606. 바이러스 (0) | 2022.04.15 |
[백준] 1260. DFS와 BFS (0) | 2022.04.07 |