백준2562 최댓값 using Python

horiz.d·2021년 10월 28일
0

열어보며

처음 문제를 봤을 땐, 최댓값의 위치를 판별해내야 하기 때문에,
정렬 알고리즘과 유사한 방식을 적절히 사용해, 위치판별을 쉽게 최적화 시킬 수 있을거라 생각했는데

입력값의 갯수를 먼저 입력받는 방식이 아닌 점을 확인하고
내가 잠시 고민한 방식은 폐기하기로 했다.

그냥 빠르고 쉽게 가겠습니다.

물론 아이디어는 폐기되었지만, 최적화를 고민하며 러닝타임 측정을 위해 time모듈을 사용할 수 있음을 배웠다.



고민

입력이 종료되는 순간은 입력이 들어오지 않는 순간으로 판별할 수 있다.

문제풀이의 두가지 방식이 빠르게 떠올랐다,

  • (1) 첫번째는 while 내에서 한 요소의 입력을 받음과 동시에 직전 값과 비교하여 최댓값을 판별하는 방식이다.

    • 이 방식은 불필요한 반복의 중복을 없앨 수 있다. 만일 max() 함수가 반복이나 정렬탐색, 혹은 유사한 그것을 포함하고 있다면 두번째 방법에 비해 이 방식이 유용할 것이다.
  • (2) 두번째로는 일단 while로 모든 입력값을 리스트에 저장한 이후, max()로 최댓값을 간편하게 얻어내고 위치는 list의 인덱스를 활용하는 방법이다.

    이 방법은 위치의 출력에도 성능의 문제가 존재하는데, 어쨌든 얻은 max값을 다시한번 list와 쭉 비교연산하여 일치하는 값을 찾는 과정을 거쳐야 하기 때문이다.

함수의 내부 소스코드는 keras의 inspect 메소드로 직접 확인할 수 있다는 점을 알아냈지만,
현재 쓰고있는 환경인 replit에서는 이 메소드를 정상적으로 활용할 수 없는 것으로 확인했다.




가볍게 생각해보아도 첫번째 방식이 성능면에서 우수할 것으로 보인다. 이는 time모듈을 이용해 아래에서 직접 비교해보겠다.

방법1,2 성능 비교

방식1 : 입력받자마자 직전인덱스와 비교,저장

#러닝타임측정 사전작업
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 내 입력값 리스트 저장을 하는 것은 사용자의 입력값 저장속도에 달려있고, 내 손은 기계가 아니기때문에 이 속도를 완벽히 통제할 수 없다. 따라서 완벽히 통제되는 비교측정이 불가능하다는 사실을 알아냈다. 물론 입력값을 균일하게 주는 방법이 있겠지만, 그에 더 시간을 쓰는것은 현시점에서 과투자라고 생각하여 일단 시도에 의의를 두고 최대한 균일하게 입력한 결과를 공유한다.



방식2 : max활용

#러닝타임측정 사전작업
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의 코드는 출력테스트는 모두 옳게 나오는데 오답처리된다. 시간상 나중에 알아보자

profile
가용한 시간은 한정적이고, 배울건 넘쳐난다.

0개의 댓글