강의로 돌아가기
김동규

가장 큰 값을 입력받을때

def solution(L, x):
    answer = []
    for i in range(len(L)):
        if x > L[i]:
            if x > L[-1]:
                L.append(x)
                break
            else:
                continue

        elif x <= L[i]:
            L.insert(i, x)
            break

    answer = L
    return answer

주어진 리스트에 x값이 100인 경우를 생각해 봤는데 다른 방법이 잘 떠오르지 않습니다.
if문을 중첩하지 않고 다른 방법이 있을까요?
또, 다른 부분에서 지적할 부분이 있는지 궁금합니다.

++개인적인 질문입니다만...
확실한 정답을 원하는 것은 아니지만, 제가 작성한 답들에 확신이 없어서 고민입니다.
혹시 어쩌다 끼워맞힌것은 아닌지...이럴땐 어떻게 해야 하나요?

1 개의 답변
이시윤

위 코드를 조금 바꾸어 쓰면, 아래와 같이 할 수도 있겠습니다.

def solution(L, x):
    if x > L[-1]:
        L.append(x)
    else:
        for i in range(len(L)):
            if x <= L[i]:
                L.insert(i, x)
                break
    return L

즉, x 가 리스트의 마지막 원소인 L[-1] 보다 큰 경우와 그렇지 않은 경우로 나누어 처리한 방식입니다. 다시 말하면, 위 코드에서처럼 이 비교가 순환문 안에 있을 필요는 없다는 것이죠. 삽입하려는 원소가 리스트 내의 가장 큰 원소보다 더 큰 경우만을 특별한 경우로 따로 떼어 처리하고 (리스트의 끝에 새 원소를 덧붙이고), 그렇지 않은 경우는 하나 하나 살펴보다가 맞는 위치가 발견되었을 때 그 자리에 새 원소를 삽입한다는 식입니다.

그러나, 이보다 조금 나은 방법도 생각해볼 수 있습니다. 예를 들어 'L = [1, 2, 3]일 때L.insert(3, x)하면 어떻게 되나요? (리스트의 맨 끝에 원소를 덧붙이는 것도insert()` 메서드를 이용할 수 있으므로, 리스트 내의 모든 원소보다 큰 새로운 원소를 삽입하는 것도 특별한 경우로 처리하지 않을 수 있지 않나요?) 이 경우에 대해서는 직접 코드를 (연습이니까요) 작성해보시기 바랍니다.

또 다른 방법도 있습니다. 리스트가 제공하는 메서드 (append()insert()) 를 이용하지 않고 슬라이싱을 이용하는 방법인데요, 순환문을 이용해서 새로운 원소인 x 가 삽입되어야 하는 위치를 찾은 뒤 (이 위치를 i 라고 하겠습니다. 예를 들어 L = [10, 20, 30] 이고 25 를 삽입한다면 i == 2 입니다.)
(1) 리스트 L 에서 이 위치 앞까지의 부분을 슬라이싱으로 얻어냄 (L[:i])
(2) 하나의 새로운 원소 x 로 이루어진 리스트를 얻어냄 ([x])
(3) 리스트 L 에서 이 위치부터 끝까지의 부분을 슬라이싱으로 얻어냄 (L[i:])
그리고 나서 이 셋을 리스트 연결 (concatenation) 하여, 즉 + 연산을 적용하여, answer 를 만들고 그것을 리턴하는 방법입니다. 이것도 좋은 연습이 될테니 직접 작성해보시기 바랍니다.

++ 혹시 어쩌다 끼워맞히기가 잘 안되도록 연습문제를 구성하려는 의도는 들어 있습니다. 그러나, 정답을 산출한다고 해서 꼭 좋은 코드라는 뜻은 아닙니다. 예를 들면 위에 작성하신 코드는 올바른 결과를 내기는 할 것이나, 구조가 좋은 코드라고 할 수는 없습니다. 자신이 고민해보았던 문제에 대해서 좋은 코드를 읽는 것은 코딩을 익히는 데 많은 도움이 됩니다. 현재 프로그래머스 운영진과 함께 특정 문제를 해결하고 나면 다른 사용자들이 제출하여 정답을 산출한 코드를 볼 수 있도록 하는 기능에 대하여 논의가 진행중입니다.

  • 김동규
    빠르고 친절한 답변 감사드립니다! 열심히 해보겠습니다. 김동규 2018.08.24 20:49
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.