프로그래머스[ LV2 | Python ] 최댓값과 최솟값
업데이트:
문제
https://programmers.co.kr/learn/courses/30/lessons/12939
주어진 문자열에서 최대값과 최소값을 찾아내 반환하는 문자열 문제.
풀이
시도
주어진 문자열에서 -
를 처리하는 것은 생각보다 까다로울 때가 있다.
문제를 봤을 때 손쉽게 해결할 생각에 문자열을 계산해주는 eval()
을 사용했다.
평균적으로 0.2ms
대의 성능을 보여준다.
그런데, 어디선가 eval 함수는 성능이 다소 좋지 못하다는 이야기를 주워들은 적이 있다.
이 차이를 직접 확인해보고자 반복문과 인덱스를 사용해 다시 작성해보기로 했다.
실행 결과
def solution(s):
vals = list(map(eval, s.split()))
return ' '.join(list(map(str, [min(vals), max(vals)])))
개선
반복문과 인덱스를 통해서 해결하기 위해 다음과 같은 흐름을 따랐다.
- 최대값과 최소값을 판별할 변수들을 초기화한다.
- 공백을 기준으로 리스트를 만든
vals
를 순회한다.- 첫 인덱스의 문자가
-
라면 음수를 취하여 해당 원소의 문자들을 합쳐 정수로 만든다. -
가 아닌 경우 해당 원소의 문자들을 합쳐 정수로 만든다.- 값을 비교하여
minval
과maxval
을 갱신한다.
- 첫 인덱스의 문자가
- 두 값을 문자열로 합쳐 출력한다.
결과적으로 메모리를 더 사용하고 0.0n
초 대의 성능으로 이끌었다.
아무래도 문자열을 한번에 처리하기 보다는 변수에 담고, 비교해야하는 과정에서 더욱 많은 메모리를 소요한 것으로 보인다.
실행 결과
def solution(s):
vals = s.split()
minval = float('inf')
maxval = -float('inf')
for v in vals:
val = 0
if v[0] == '-':
val = -int(v[1:])
else:
val = int(v[:])
minval = min(val, minval)
maxval = max(val, maxval)
return str(minval) + " " + str(maxval)
생각 & 정리
손쉽게 사용하는 함수를 한번 더 생각해보고, 과연 사용이 옳은 일일까 라고 의심하는 순간이 많아질 것 같다.
물론 이전에도 생각해왔듯이, 화려한 퍼포먼스보다 가독성을 위한 코드를 택할 일이 더욱 많겠지만, 왜? 사용하는가에 대한 이유를 알고있다면, 구현할 수 있는 방법과 그 폭이 더욱 넓어질 것이라는 생각이 드는 문제였다.
댓글남기기