[백준] 2010. 플러그

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