sliding window 를 연습하기위해 leetcode 239번 문제를 풀고 있었다.
링크: leetcode.com/problems/sliding-window-maximum/
계속 시간 초과가 나와서 한번은 정답 코드 로직을 그대로 따라했는데도 시간 초과가 나왔다. 정답 코드와 내가 입력한 코드의 차이점은 변수 이름의 길이 밖에 없었고, 나는 '변수 이름의 길이가 프로그램의 효율성(시간)에 영향을 줄까?'라는 의문을 가지게 됐다. 공간이야 이름의 길이가 길어졌으니 더 쓸거라고 생각은 했지만, 시간은 어렴풋이 그럴수도 있겠다고 생각만 했지, 직접 확인해보지는 않았다. 그래서 이왕 이렇게 된거 직접 확인을 해봤다.
import timeit
test_1 = timeit.Timer(stmt='a = 0')
a = test_1.repeat()
# result
a
# [0.033554370998899685, 0.013415411998721538, 0.010835048000444658]
sum(a)/3
# 0.017626403666023787
Timeit 라이브러리를 사용해서 변수에 값을 할당하는데 걸리는 시간을 측정했다. 첫번째 실험은 'a = 0'으로 변수의 길이가 1이다.
'a=0' statement를 실행하는데 걸린 평균 시간은 0.0170.017626403666023787 초였다.
짧은 이름의 변수에 할당해봤으니 이제 긴 이름의 변수에 할당을 할 차례다.
test_2 = timeit.Timer(stmt='abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz=0')
b = test_2.repeat()
# result
b
# [0.033554370998899685, 0.013415411998721538, 0.010835048000444658]
sum(b)/3
# 0.02964366699961829
'abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz = 0' statement를 실행하는데 걸린 평균 시간은 무려 0.02964366699961829초다. 무려 1.68배가 걸렸다.
물론 컴퓨터 사양이나 변수 이름의 길이의 차이에 따라 다른 결과가 나오겠지만 이렇게 차이가 많이 나니까 조금 충격적이었다.
단순히 변수 이름의 길이를 줄여서 최적화 해야 한다고는 생각하지 않지만(의미있고 이해하기 쉬운 이름이 최고)... 변수 이름의 길이가 실행 시간에 영향을 줄 수 있다는 걸 알고 있으면 나쁘지는 않을거같다!
+
leetcode 239번 문제는 정답 코드와 변수 명을 같게(변수 이름의 길이를 줄임)해도 시간초과로 통과되지 않았고, 다른 로직을 사용해서 풀었다. 변수 이름의 길이가 문제가 아니긴 했다.
59 / 61 test cases passed. |
어디서 시간 초과가 걸렸나 확인해보니 거의 마지막 테스트케이스에서 걸렸다. 정답 코드는 몇 년 전에 작성된거니까 아무래도 테스트 케이스가 추가되기 전에 작성된거라고 생각하기로 했다.
그런데 조금 웃겼던 건 이 문제를 3월 11일에 풀다가 그만 풀었는데
변수명이랑 로직이 지금이랑 완전히 똑같다...! 테스트케이스도 같은데서 걸렸다..
브루트포스 방법은 역시 easy를 풀 때나 통과되고 medium이랑 hard문제는 조금씩이라도 최적화를 해야하는 것 같다.
이 문제는 그래도 hard 문제 치고는 쉬웠던 것 같다. 그냥 window를 옮길 때마다 현재 최대 숫자가 빠지면 다시 최대 숫자를 구해주고, 현재 최대 숫자가 빠지는게 아니면 새로 들어오는 숫자랑 현재 최대 숫자의 크기만 비교해주면 됐다.
'Algorithm > Python' 카테고리의 다른 글
[파이썬/프로그래머스]순위검색 (0) | 2021.05.10 |
---|---|
[파이썬/프로그래머스]수식최대화 (0) | 2021.05.08 |
[파이썬/백준 1991]트리 순회 (0) | 2021.04.17 |
[파이썬/백준 1389]케빈 베이컨의 6단계 법칙 (0) | 2021.04.17 |
[파이썬/백준 2667]단지번호붙이기 (0) | 2021.04.15 |