강의로 돌아가기
신종민

List를 순회하게처리 했는데 문제점을 잘 모르겠습니다.

def solution(L, x):
    # index를 담을 리스트
    index_list = []

    # list를 순회하면서 index()를 이용해서 값을 찾음.
    for int in L:
        try:
            index = L.index(x)
            del(L[index])
            length = len(index_list)
            if length > 0:
                index = index + length
            index_list.append(index)
        except ValueError:
            pass
    if len(index_list) ==0:
        index_list.append(-1)
    return index_list

해당 코드로 문제를 풀려했지만 이상하게도
마지막 for문이 돌지않는 듯 했습니다.(첫번째 테스트케이스에서)

그래서 L_cnt를 구하고
while문을 이용해서 처리하니 문제가 풀리긴했는데
위의 코드에서 문제점 을 잘모르겠어서 질문에 적어봅니다.

(아래는 완료한 코드입니다.)

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(L, x):
    # index를 담을 리스트
    index_list = []
    L_cnt = len(L)
    # list를 순회하면서 index()를 이용해서 값을 찾음.
    while(L_cnt > 0):
        try:
            index = L.index(x)
            del(L[index])
            length = len(index_list)
            if length > 0:
                index = index + length
            index_list.append(index)
        except ValueError:
            pass
        L_cnt -= 1
    if len(index_list) ==0:
        index_list.append(-1)
    return index_list
1 개의 답변
이시윤

무엇보다도 먼저, 위 코드에서 순환문의 반복 조건이 적당하지 않습니다. 아래의 두 가지 방법 중 하나를 택하는 것이 바람직하다고 생각합니다.

(1) 리스트의 원소를 하나 하나 점검하면서 순회하고, 이것이 주어진 x 의 값과 같은지를 비교하여 같은 경우 그 인덱스를 저장하는 방법
(2) 리스트 내에 x 와 같은 원소가 존재하는 동안 순회하고, index() 메서드를 이용하여 이 리스트의 어느 인덱스 위치에 해당 원소가 있는지를 알아내며, 반복하면서 그 위치를 포함한 리스트의 앞 부분을 잘라서 버리는 방법

위의 방법들 중 하나를 이용한다면, del() 을 이용해서 리스트 내에서 특정 원소를 제거할 필요가 없어질 것입니다. (두 번째 방법에서는 지문에 힌트로 주어져 있는 리스트 슬라이싱 을 이용합니다.)

두 방법을 비교한다면, 첫번째의 방법이 두 번째의 방법보다 쉽게 적용할 수 있을 것입니다. 그 접근법으로 우선 문제를 풀어 보시고, 테스트 케이스를 모두 통과한다면 두 번째 접근법으로 구현해 보세요. 이 때 중요한 것은 순환문의 조건입니다. 말로 하자면, 더 이상 이 위치보다 뒤에서는 `x` 와 같은 원소가 발견되지 않는 경우 이며, 이것은 while 또는 if 의 조건문으로 표현할 수도 있고 (리스트의 in 연산을 이용해서), 또다른 방법으로는 (위의 코드에서 시도하려 했던 것으로 보이는) index() 메서드가 ValueError 를 일으킬 때 순환문을 탈출하도록 (break) 만드는 방법도 있을 것입니다.

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