처음 문제를 봤을 땐, 최댓값의 위치를 판별해내야 하기 때문에,
정렬 알고리즘과 유사한 방식을 적절히 사용해, 위치판별을 쉽게 최적화 시킬 수 있을거라 생각했는데
입력값의 갯수를 먼저 입력받는 방식이 아닌 점을 확인하고
내가 잠시 고민한 방식은 폐기하기로 했다.
그냥 빠르고 쉽게 가겠습니다.
물론 아이디어는 폐기되었지만, 최적화를 고민하며 러닝타임 측정을 위해 time모듈을 사용할 수 있음을 배웠다.
입력이 종료되는 순간은 입력이 들어오지 않는 순간으로 판별할 수 있다.
문제풀이의 두가지 방식이 빠르게 떠올랐다,
(1) 첫번째는 while 내에서 한 요소의 입력을 받음과 동시에 직전 값과 비교하여 최댓값을 판별하는 방식이다.
(2) 두번째로는 일단 while로 모든 입력값을 리스트에 저장한 이후, max()로 최댓값을 간편하게 얻어내고 위치는 list의 인덱스를 활용하는 방법이다.
이 방법은 위치의 출력에도 성능의 문제가 존재하는데, 어쨌든 얻은 max값을 다시한번 list와 쭉 비교연산하여 일치하는 값을 찾는 과정을 거쳐야 하기 때문이다.
함수의 내부 소스코드는 keras의 inspect 메소드로 직접 확인할 수 있다는 점을 알아냈지만,
현재 쓰고있는 환경인 replit에서는 이 메소드를 정상적으로 활용할 수 없는 것으로 확인했다.
가볍게 생각해보아도 첫번째 방식이 성능면에서 우수할 것으로 보인다. 이는 time모듈을 이용해 아래에서 직접 비교해보겠다.
#러닝타임측정 사전작업
import time
import datetime
#러닝타임측정시작
start = time.time()
#방법1
list1dim = []
i = 0
intHigher = 0
indexH = 0
while 1 :
try :
list1dim.append(int(input()))
except :
break
if i == 0 :
intHigher = list1dim[i]
else :
if list1dim[i] > intHigher :
intHigher = list1dim[i]
indexH = i+1
i += 1
print(intHigher)
print(indexH)
#러닝타임 후작업
sec = time.time()-start
times = str(datetime.timedelta(seconds=sec)).split(".")
times = times[0]
print(times)
문제가 생겼다..
핵심 로직인 while 내 입력값 리스트 저장을 하는 것은 사용자의 입력값 저장속도에 달려있고, 내 손은 기계가 아니기때문에 이 속도를 완벽히 통제할 수 없다. 따라서 완벽히 통제되는 비교측정이 불가능하다는 사실을 알아냈다. 물론 입력값을 균일하게 주는 방법이 있겠지만, 그에 더 시간을 쓰는것은 현시점에서 과투자라고 생각하여 일단 시도에 의의를 두고 최대한 균일하게 입력한 결과를 공유한다.
#러닝타임측정 사전작업
import time
import datetime
#러닝타임측정시작
start = time.time()
#방식2
list1dim= []
while 1 :
try :
list1dim.append(int(input()))
except :
break
print(max(list1dim))
for i in range(len(list1dim)) :
if list1dim[i] == max(list1dim) :
print(i)
break
#러닝타임 후작업
sec = time.time()-start
times = str(datetime.timedelta(seconds=sec)).split(".")
times = times[0]
print(times)
성능 비교결과 완벽히 통제되지 않은 비교였고, 아주 근소한 차이였긴 하지만
생각했던대로 방식1이 근소하지만 1초 더 빠르게 나와주었고 조금 더 애착이 가지만, 어차피 근소한 차이이며 테스트 신뢰도가 낮으므로 좀더 직관적이고 짧은 방식2를 최종 코드로 선택하여 공유한다.
#방법2
list1dim= []
while 1 :
try :
list1dim.append(int(input()))
except :
break
print(max(list1dim))
for i in range(len(list1dim)) :
if list1dim[i] == max(list1dim) :
print(i+1)
break
p.s ) 방식1의 코드는 출력테스트는 모두 옳게 나오는데 오답처리된다. 시간상 나중에 알아보자