강의로 돌아가기
김진산

코드 피드백 바랍니다.

더 좋은 방법이 있을까요?

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(L, x):
    if not L:
        print("List is NULL")
        exit(1)

    if x <= L[0]:
        L.insert(0, x)
    elif x >= L[-1]:
        L.append(x)
    else :
        for i in L:
            if i <= x:
                idx = L.index(i)
        L.insert(idx + 1, x)

    answer = L
    return answer
1 개의 답변
이시윤

이 코드는 주어진 문제에 대한 정답을 출력함에는 부족함이 없지만, 보다 낫게 할 수 있는 방법이 있습니다.

(1) L6 의 if x <= L[0]: 의 조건과 L8 의 elif x >= L[-1]: 의 두 조건은, 이후 (LL11-13) 의 순환문 안에서 처리할 수 있도록 조건을 구성할 수 있습니다. 즉, 하나의 순환문 안에서 위 두 경우에 대해서도 동일한 방법을 적용하는 것이 가능합니다. (그렇게 하려면 어떤 형태의 코드를 쓰는 것이 좋을지 생각해 보시기 바랍니다. 좋은 연습이 될 듯합니다.)

(2) L13 의 idx = L.index(i) 는 불필요한 비효율을 야기합니다. 주어진 원소 i 의 리스트 내에서의 위치 (인덱스) 를 얻어내는 index() 메서드의 실행 시간은 리스트의 길이에 비례합니다. 즉, 리스트가 길면 길수록 오래 걸리는 일입니다. 여기서 우리는 리스트 원소 하나 하나를 앞에서부터 뒤쪽으로 순회하면서 접근하고 있기 때문에, 리스트 내에서의 인덱스를 구하기 위해서 이 메서드의 활용이 필요하지 않습니다. (그렇게 하자면 순환문의 구조가 조금 달라져야 하겠는데, 어떤 방법을 택할 수 있을지 생각해 보시기 바랍니다. 좋은 연습이 될 듯합니다.)

짧게 쓰면, 대강 def 로부터 return 까지 여섯 줄 정도에 (억지로 두 줄을 붙여 쓰거나 하지 않으면서도) 전체 함수를 만들 수 있습니다. 짧은 코드가 무조건 좋은 것은 아니지만, 첫째, 불필요한 비효율이 없고, 둘째, 사람이 보고 이해하기에도 좋은 코드가 구조적으로 우수한 코드입니다. 코드의 개선을 시도해 보시기 바랍니다. 괜찮아 보이는 코드를 답변에 적을 수도 있지만, 그걸 섣불리 보는 것은 코딩 연습에도 좋지 않고, 이후에 같은 문제를 풀어 보게 될 다른 사용자들에게도 연습에 좋지 않은 영향을 미칠 수 있어서 모범 코드를 공개하지는 않습니다. 이 문제는 초반에 있어서 매우 간단한 코드이기는 하나, 초기부터 좋은 코드를 쓰도록 연습을 해 보십시오. 이후의 알고리즘들을 직접 코딩하고 그러한 종류의 연습문제를 풀어 내는 데 있어서 필수의 역량입니다.

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.