업데이트:

1 분 소요

문제

https://programmers.co.kr/learn/courses/30/lessons/12939

P_12939.png

주어진 문자열에서 최대값과 최소값을 찾아내 반환하는 문자열 문제.

풀이

시도

주어진 문자열에서 - 를 처리하는 것은 생각보다 까다로울 때가 있다.
문제를 봤을 때 손쉽게 해결할 생각에 문자열을 계산해주는 eval() 을 사용했다.
평균적으로 0.2ms 대의 성능을 보여준다.

그런데, 어디선가 eval 함수는 성능이 다소 좋지 못하다는 이야기를 주워들은 적이 있다.
이 차이를 직접 확인해보고자 반복문과 인덱스를 사용해 다시 작성해보기로 했다.

실행 결과

P_12939-1.png

def solution(s):
    vals = list(map(eval, s.split()))
    return ' '.join(list(map(str, [min(vals), max(vals)])))

개선

반복문과 인덱스를 통해서 해결하기 위해 다음과 같은 흐름을 따랐다.

  1. 최대값과 최소값을 판별할 변수들을 초기화한다.
  2. 공백을 기준으로 리스트를 만든 vals를 순회한다.
    1. 첫 인덱스의 문자가 - 라면 음수를 취하여 해당 원소의 문자들을 합쳐 정수로 만든다.
    2. -가 아닌 경우 해당 원소의 문자들을 합쳐 정수로 만든다.
    3. 값을 비교하여 minvalmaxval을 갱신한다.
  3. 두 값을 문자열로 합쳐 출력한다.

결과적으로 메모리를 더 사용하고 0.0n 초 대의 성능으로 이끌었다.
아무래도 문자열을 한번에 처리하기 보다는 변수에 담고, 비교해야하는 과정에서 더욱 많은 메모리를 소요한 것으로 보인다.

실행 결과

P_12939-2.png

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)

생각 & 정리

손쉽게 사용하는 함수를 한번 더 생각해보고, 과연 사용이 옳은 일일까 라고 의심하는 순간이 많아질 것 같다.
물론 이전에도 생각해왔듯이, 화려한 퍼포먼스보다 가독성을 위한 코드를 택할 일이 더욱 많겠지만, 왜? 사용하는가에 대한 이유를 알고있다면, 구현할 수 있는 방법과 그 폭이 더욱 넓어질 것이라는 생각이 드는 문제였다.

댓글남기기