백준 2670번 바로가기

첫 번째 풀이

l = []
for _ in range(n:=int(input())):
  l.append(float(input()))

s = []
for i in range(n):
  temp = l[i]
  s.append(temp)
  for j in range(i+1,n):
    temp *= l[j]
    s.append(temp)

print(round(max(s),3))

메모리 초과

두 번째 풀이

l = []
for _ in range(n:=int(input())):
  l.append(float(input()))

max = max(l)
for i in range(n):
  temp = l[i]
  for j in range(i+1,n):
    temp *= l[j]
    if temp > max:
      max = temp

print(round(max, 3))

시간 초과

세 번째 풀이

l = []
for _ in range(n:=int(input())):
  l.append(float(input()))

m = max(l)
for i in range(n):
  temp = l[i]
  for j in range(i+1,n):
    temp *= l[j]
    if temp > m:
      m = temp

print('%.3f' % m)

고수의 풀이

n=int(input())
a=[float(input())for _ in[0]*n]
for i in range(1,n):a[i]=max(a[i-1]*a[i],a[i])
print(f'{max(a):.3f}')

출처

CODE REVIEW

  1. 메모리 초과 문제를 해결하기 위해 list에서 max를 뽑아내지 않고 m(현재 최댓값)보다 크면 update, 크지 않다면 그대로 pass로 바꾸어주었다.
  2. 문제 출력 형식이 소수 셋째 자리까지 맞추어줘야하므로 round()함수 대신 '%.3f % m처럼 소숫점 출력 형식으로 바꾸어주었다.
  3. 고수의 풀이 방식이 메모리도 덜 차지하고 시간도 빠른데, 각 자리별로 구할 수 있는 max값을 a[i]에 할당하고, 그것의 max를 구한다는 아이디어였다.
  4. python에서 max, min같은 이름은 변수에 붙이지 않는걸 권장한다! 웬만하면 다른 이름을 쓰자